3

我创建了自定义音频播放器类,它使用AudioUnitExtAudioFile. 在我的课堂上,我准备了自己的渲染回调函数,例如

OSStatus MyAURenderCallack (
   void                        *inRefCon,
   AudioUnitRenderActionFlags  *ioActionFlags,
   const AudioTimeStamp        *inTimeStamp,
   UInt32                      inBusNumber,
   UInt32                      inNumberFrames,
   AudioBufferList             *ioData
);

当我的应用程序在前台时,inNumberFrames操作系统传递的参数总是512or 1024,我的播放器运行良好。
但是当iOS设备睡觉时,inNumberFrames变成了4096,我的播放器无法工作,因为它一次无法准备这么多帧。

帧准备过程很难改进,因为它大量使用extAudioFileRead函数,很难加速。

所以,我想限制inNumberFrames变得大于1024.
我能做到吗?

4

1 回答 1

3

正如@sbooth 所说,你真的应该在另一个线程中写入磁盘。如果不是,这会给应用程序的主线程带来真正的压力,它应该专注于提供音频而不会丢失。

但是要直接回答您的问题:不,您不能直接告诉操作系统用于块大小的确切帧数。你可以建议它使用一定的延迟,结合请求的采样率会给你一个大概的块大小。但是,不能保证 iOS 会给你这个块大小。

但是,您最好的选择是让您的算法适用于任意块大小。除非您正在执行卷积之类的操作,否则通常使用较大的块应该更容易。因此,如果您在 4096 遇到问题,您可能应该分析您的代码并查看潜在问题是什么。

于 2011-10-17T11:35:11.487 回答