我正在尝试连接ios设备库中的两个m4a音频文件,我获得了成功,这是我正在使用的代码 -
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc]
initWithAsset: songAsset
presetName: AVAssetExportPresetAppleM4A];
NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes);
exporter.outputFileType = @"com.apple.m4a-audio";
[exporter exportAsynchronouslyWithCompletionHandler:^{}.....
当我检查这些文件时,原始文件的比特率仅为16 kbps但AVAssetExportSession文件的比特率为192 kbps ...因此似乎AVAssetExportSession会增加结果文件的比特率。有没有人有像这样的问题的解决方案或有任何方法为结果文件指定比特率???
答案 0 :(得分:1)
<强>更新强>
如果您确定AAC / m4a文件的格式相同,那么您可以通过从文件中提取原始AAC(aka adts)流来执行您想要的操作,并将其连接起来原始数据包,然后将结果包装回m4a容器中。这应该摆脱你看到仍然可以播放的比特井喷。
以下文件对我来说很好。
cat file1.aac file2.aac > catted.aac
亲自尝试:
afconvert -d aac file1.m4a file1.aac
afconvert -d aac file2.m4a file2.aac
cat file1.aac file2.aac > concatenated.aac
afconvert -f m4af concatenated.aac concatenated.m4a
要将此shell脚本转换为AudioToolbox
代码,您可以执行类似这样的操作
AudioFileReadPackets(/*from file1.m4a*/); // all of the packets
AudioFileWritePackets( /* to concatenated.m4a */);
AudioFileReadPackets(/*from file2.m4a*/); // all of the packets
AudioFileWritePackets( /* to concatenated.m4a */);
这应该很快,因为没有解码/编码(只有数据包解析),并且生成的文件的比特率不会发生显着变化。
<强>旧版强>
我认为AVAssetExportPresetAppleM4A
改变你的比特率是奇怪的 - 我的实验让比特率保持不变。但是我使用的是单个 AAC / m4a文件。
如果你使用AVAssetExportSession
连接多个文件并将它们导出为AAC / m4a,我认为你不能避免比特率变化(当多个文件中的比特率不同时会发生什么?)然而,选择最终的比特率是另一回事。
正如您所注意到AVAssetExportSession
对导出参数的控制仅限于少数预设。为了更好的控制,我会使用AVAssetWriter
。当您创建AVAssetWriterInput
时,您有dizzying array of options,包括AVEncoderBitRateKey
。
如果你想留在AVAssetExportSession
并且只想要一个较低比特率的音频版本,你 可以AVFileTypeQuickTimeMovie
导出AVAssetExportPresetLowQuality
或AVAssetExportPresetMediumQuality
。当然,你有一个.mov文件而不是m4a,而另一个AVAssetExportSession
作为AVFileTypeAppleM4A/AVAssetExportPresetAppleM4A
将会解决这个问题。这两个预设通过转换为单声道22&amp;分别为44.1 kHz音频。听起来不太好。