我正在重新实现一些非常旧的代码,这些代码通过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!");
}];
我已经浏览了定义AVFileTypeWAVE
和kAudioFormatLinearPCM
的标头,但找不到任何看起来会导致产生WAVE_FORMAT_PCM文件的设置。
如果无法用WAVE_FORMAT_EXTENSIBLE
描述文件的基础格式,则必须使用WAVE_FORMAT_PCM
,但是我不认为我正在处理的音频文件就是这种情况:编写代码来编辑Wave标题,使文件的data
部分保持不变,然后我的应用程序可以根据需要处理生成的文件(并在其他应用程序中正常显示和播放)。
如果情况变得最糟,我可以在我的发行版中使用此Wave-header编辑代码,但是如果存在的话,我更喜欢更干净的解决方案。
是否可以让AVFoundation
以我需要的格式编写文件,或者我可以使用其他一些API来执行此任务吗?