【问题标题】:AUGraph setup on iOSiOS上的AUGraph设置
【发布时间】:2012-07-10 08:54:09
【问题描述】:

我正在为 iOS 应用程序设计 AUGraph,希望能在以下方面提供帮助。

如果我想一次播放多个音频文件,每个文件都需要一个音频单元吗?

来自 Core-Audio 文档

线性 PCM 和 IMA/ADPCM (IMA4) 音频您可以在 iOS 中同时播放多个线性 PCM 或 IMA4 格式的声音,而不会产生 CPU 资源问题。

AAC、MP3 和 Apple 无损 (ALAC) 音频播放 AAC、MP3 和 Apple 无损 (ALAC) 声音在 iPhone 和 iPod touch 上使用基于硬件的高效解码。您一次只能播放一种这样的声音。

因此不能同时播放多个 AAC 或 MP3 文件。一次播放多个声音的最佳 LPCM 格式是什么?

这是否也适用于音频单元,如 AudioQueue 文档中所述。

AUGraph 中的音频单元可以处于非活动状态吗?如果 AUGraph 看起来像这样

扬声器/输出

如果记录器不活动会发生什么,它仍然会拉,但只是不将缓冲区写入文件吗?

【问题讨论】:

    标签: ios core-audio


    【解决方案1】:

    没有;您需要使用混音器音频单元。检查这个: http://developer.apple.com/library/ios/DOCUMENTATION/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/ConstructingAudioUnitApps/ConstructingAudioUnitApps.html#//apple_ref/doc/uid/TP40009492-CH16-SW1

    主要是阅读上面的文档,将示例代码包装在一个类中并创建一对实用结构,我从头开始编写了这个“简单声音引擎”:

    ttp://nicolasmiari.com/blog/a-simple-sound-engine-for-ios-using-the-audio-unit-framework/ (链接到我博客中包含源代码的文章)。 抱歉,已将博客移至 Jekyll/Github,这篇文章没有成功。

    ...本来打算在github上做一个repo,但是太麻烦了。我是一个视觉型的人,仍然非常害怕 git。 好吧,那是很久以前的事了……现在我从命令行使用 git :-)

    您可以按原样使用它,也可以提取与音频单元相关的代码并使其适应您的项目。 我相信 Cocos Denshion 'Simple Audio Engine' 做的事情几乎相同,但没有检查源代码。

    已知问题 如果您为 C++ 异常设置了异常断点,则在调试时,代码将在 AUGraphInitialize() 处停止 2 或 3 次。这是一个“非崩溃”异常,因此您可以单击继续,代码运行正常。

    要将您的 wav 文件转换为未压缩的 .caf 格式,请在终端上使用以下命令:

    %afconvert -f caff -d LEI16 mysoundFile.wav mySoundFile.caf
    

    编辑: 毕竟我创建了一个 GitHub 存储库: https://github.com/nicolas-miari/Sound-Engine

    【讨论】:

    • 所以我不需要转换音频文件?如果有不同的格式怎么办。例如mp3、AAC、WAV等不需转换都可以同时播放吗?
    • 您可以播放任意数量的文件,只要它们是(未压缩的)caf 格式。您一次最多可以播放 1 个 mp3(由于硬件)
    • 我将发布我的音频引擎的源代码(我现在在 iPhone 上)
    • 哇。我真的很感激。 :) 我将开始阅读该文件这么久。谢谢!
    • 感谢您的回答。我很快就会看看这个帖子。但是,我确实想在应用程序转换中进行,但我可以做到这一点没问题。我现在只是不确定文件类型。文档说 LPCM 文件可以同时播放。那么我需要将WAV转换为caf吗?我认为它可以正常工作,但必须将 mp3 或 AAC 转换为 LPCM。如果我想使用 URL 播放 ipod 库中的 2 首曲目会怎样​​?这些是否需要先转换并存储在某个地方?
    【解决方案2】:

    普通的常见 .wav 和 .caf 文件都包含原始 PCM 音频样本,如果已经达到目标采样率,则无需硬件辅助或 DSP 处理即可播放。

    当没有音频文件或其他合成数据向正在拉缓冲区的音频单元提供数据时,通常的做法是向其提供静音缓冲区(或者如果前一个缓冲区以非零幅度结束,则可能会逐渐减少到零)。

    【讨论】:

    • 我想在按下按钮而不循环播放样本时播放样本。在我的渲染回调中,如何将静音传递给 AudioBufferList?
    • 可能取决于您的音频样本格式,但通常将列表分解为内存指针和大小,并使用相应数据类型的相应数量的零复制或填充内存,例如线性 16-位签名的 PCM。
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多