可以使用AVAssetWriter编写WAVE_FORMAT_PCM Wave文件吗?

时间:2018-06-22 15:06:30

标签: macos audio avfoundation wav avassetwriter

我正在重新实现一些非常旧的代码,这些代码通过Carbon Quicktime API将AIFF文件转换为Wave文件。

我需要使我的实现早于OS X 10.9,因此使用AVFoundation的AVAssetReader / AVAssetWriter似乎是可行的方法。但是,我需要输出为WAVE_FORMAT_PCM文件,但是AVFoundation正在输出WAVE_FORMAT_EXTENSIBLE子格式的KSDATAFORMAT_SUBTYPE_PCM文件。

这是我的代码的简化版本:

AVAsset* asset = [AVAsset assetWithURL:url];
AVAssetReader* reader = [AVAssetReader assetReaderWithAsset:asset error:&err];

AVAssetTrack* track = [[asset tracksWithMediaType:AVMediaTypeAudio]
                                    objectAtIndex:0];

NSDictionary *compressionSettings = @{
       AVFormatIDKey: [NSNumber numberWithUnsignedInt:kAudioFormatLinearPCM],
       AVSampleRateKey: [NSNumber numberWithUnsignedInteger:44100],
       AVLinearPCMBitDepthKey: [NSNumber numberWithUnsignedInt:16],
       AVLinearPCMIsNonInterleavedKey: @NO,
       AVLinearPCMIsFloatKey: @NO,
       AVLinearPCMIsBigEndianKey: @NO,
       AVNumberOfChannelsKey: [NSNumber numberWithUnsignedInteger:2]
       };

AVAssetReaderOutput* readerOutput =
    [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track
                                               outputSettings:compressionSettings];
[reader addOutput:readerOutput];

AVAsset* outAsset = [AVAsset assetWithURL:outURL];
AVAssetWriter* writer = [AVAssetWriter assetWriterWithURL:outURL
                                                 fileType:AVFileTypeWAVE
                                                    error:&err];

AVAssetWriterInput* writerInput =
    [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio
                                       outputSettings:compressionSettings];

[writer addInput:writerInput];

[writer startWriting];
[writer startSessionAtSourceTime:kCMTimeZero];
[reader startReading];
CMSampleBufferRef sample = [readerOutput copyNextSampleBuffer];
while( sample != NULL )
{
  while (TRUE) {
    if ([writerInput isReadyForMoreMediaData]) {
      [writerInput appendSampleBuffer:sample];
      break;
    }
  }
  CFRelease( sample );
  sample = [readerOutput copyNextSampleBuffer];
}
[writer finishWritingWithCompletionHandler:^(){
  NSLog(@"Done!");
}];

我已经浏览了定义AVFileTypeWAVEkAudioFormatLinearPCM的标头,但找不到任何看起来会导致产生WAVE_FORMAT_PCM文件的设置。

如果无法用WAVE_FORMAT_EXTENSIBLE描述文件的基础格式,则必须使用WAVE_FORMAT_PCM,但是我不认为我正在处理的音频文件就是这种情况:编写代码来编辑Wave标题,使文件的data部分保持不变,然后我的应用程序可以根据需要处理生成的文件(并在其他应用程序中正常显示和播放)。

如果情况变得最糟,我可以在我的发行版中使用此Wave-header编辑代码,但是如果存在的话,我更喜欢更干净的解决方案。

是否可以让AVFoundation以我需要的格式编写文件,或者我可以使用其他一些API来执行此任务吗?

0 个答案:

没有答案