我正在编写一个iOS应用程序,其中一个功能是播放音频指令。
每次应用程序想要播放音频时,它会从非标准文件中读取,并将该音频的PCM数据放入内存缓冲区中。
尽管我有了包含PCM数据的缓冲区,但我在让应用程序实际播放声音方面遇到了麻烦。在搜索iOS文档后,我开始实现AudioUnit。这个AudioUnit的问题是使用渲染回调(据我所知,这是输出声音的唯一方法)。来自Apple开发者文档:
“…渲染回调具有严格的性能要求,您必须遵守。渲染回调位于实时优先级线程上,在此线程上,后续渲染调用以异步方式到达。您在渲染回调体中执行的工作都在这个受时间限制的环境中进行。如果您的回调在响应上一个渲染调用产生样本帧时仍在产生样本帧,则声音会出现间隙。因此,您不能在渲染回调函数的主体中锁定、分配内存、访问文件系统或网络连接,或以其他方式执行耗时任务。”
如果我不能在渲染回调方法中使用锁,则无法在读取缓冲区时写入它。由于渲染回调将不断访问它,因此没有机会读取文件并写入缓冲区。
我找到的唯一示例实际上是在渲染方法内生成PCM数据,而我无法这样做。
这是使用AudioUnits(具有异步渲染回调)的唯一方法吗?
有没有从内存中播放PCM数据的替代方案?
每次应用程序想要播放音频时,它会从非标准文件中读取,并将该音频的PCM数据放入内存缓冲区中。
尽管我有了包含PCM数据的缓冲区,但我在让应用程序实际播放声音方面遇到了麻烦。在搜索iOS文档后,我开始实现AudioUnit。这个AudioUnit的问题是使用渲染回调(据我所知,这是输出声音的唯一方法)。来自Apple开发者文档:
“…渲染回调具有严格的性能要求,您必须遵守。渲染回调位于实时优先级线程上,在此线程上,后续渲染调用以异步方式到达。您在渲染回调体中执行的工作都在这个受时间限制的环境中进行。如果您的回调在响应上一个渲染调用产生样本帧时仍在产生样本帧,则声音会出现间隙。因此,您不能在渲染回调函数的主体中锁定、分配内存、访问文件系统或网络连接,或以其他方式执行耗时任务。”
如果我不能在渲染回调方法中使用锁,则无法在读取缓冲区时写入它。由于渲染回调将不断访问它,因此没有机会读取文件并写入缓冲区。
我找到的唯一示例实际上是在渲染方法内生成PCM数据,而我无法这样做。
这是使用AudioUnits(具有异步渲染回调)的唯一方法吗?
有没有从内存中播放PCM数据的替代方案?