AudioFileOpenURL和ExtAudioFileOpenURL有什么区别?

时间:2011-06-20 21:30:58

标签: ios core-audio audiounit

如果我将ExtAudioFile与remoteIO音频设备结合使用,我可以使用ExtAudioFileSetPropertykExtAudioFileProperty_ClientDataFormat将从磁盘读取的音频格式转换为设备本机格式(使用规范的au标签)。< / p>

当我使用AudioFileOpenURL和相关方法时,我似乎无法以同样的方式使用AudioFileSetPropertykAudioFilePropertyDataFormat

为什么我不能通过稍高级别的api将任何音频文件转换为客户端数据格式?

2 个答案:

答案 0 :(得分:4)

AudioFile API排在第一位,是两者中的较低级别。 ExtAudioFile本质上是AudioFile和相关AudioConverter的包装器。它是ExtAudioFile的内部AudioConverter,它提供转换为特定客户端格式的功能。

答案 1 :(得分:0)

事实证明,您可以在较旧的AudioFile工具上设置输出格式。诀窍(至少在Mac上,但我非常肯定在iOS上是相同的)是设置你正在配置的AudioUnit的输出格式来呈现给定的音频文件,而不是文件对象: / p>

// Set file player AU's output format, it will do format conversion automatically for us
CheckError(AudioUnitSetProperty(_audioFileUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outputFormat, sizeof(AudioStreamBasicDescription)));

在设置输出格式之后忘记AudioUnitInitialize()此单元,在设置要播放的文件区域之前

另一件事:我不认为ExtAudioFile是一个更高级别的东西,就像@sbooth在另一个答案中说的那样,实际上恰恰相反。较旧的AudioFile使用起来比较棘手,但最终它可以自我渲染并处理线程问题,而ExtAudioFile只是一个无法自我渲染的I / O工具。通常,文件I / O不能在音频线程中执行,因此ExtAudioFileRead()应该缓存文件的区域,可能有几个前瞻区域以确保不间断的播放,并以某种方式将它们传递给渲染线程以线程安全的方式。正如您所看到的,围绕ExtAudioFile构建渲染器可能更具挑战性。