ExtAudioFileRead 太慢。如何让它更快?

Posted

技术标签:

【中文标题】ExtAudioFileRead 太慢。如何让它更快?【英文标题】:ExtAudioFileRead is too slow. How to make it faster? 【发布时间】:2017-03-21 00:23:38 【问题描述】:

我已经编写了自己的音频库。 (傻,我知道,但我喜欢它。)现在,我用它来播放 ios 上 iPod 库中的立体声文件。它运行良好,只是有时调用 ExtAudioFileRead() 需要超过 23 毫秒。由于我的 AudioUnits 输出设置以 44.1KHz 播放音频,并且每次回调要求 1024 帧。我的代码 + ExtAudioFileRead() 响应时间不得超过 23 毫秒。

我很惊讶 ExtAudioFileRead() 这么慢。我正在做的事情似乎很正常。我在想一定有一些我没有做的未记录的配置魔法。这是我的相关配置代码:

ExtAudioFileRef _extAudioFileRef;
OSStatus        result;

result = ::ExtAudioFileOpenURL((__bridge CFURLRef)_url, &_extAudioFileRef);

AudioStreamBasicDescription     format;

format.mBitsPerChannel = 8 * sizeof(float);
format.mBytesPerFrame = sizeof(float);
format.mBytesPerPacket = sizeof(float);
format.mChannelsPerFrame = channelCount;
format.mFormatFlags = kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
format.mFormatID = kAudioFormatLinearPCM;
format.mFramesPerPacket = 1;
format.mSampleRate = framesPerSecond;
result = ::ExtAudioFileSetProperty(_extAudioFileRef,
                                    kExtAudioFileProperty_ClientDataFormat,
                                    sizeof(format),
                                    &format);

我没有设置 _extAudioFileRef 的任何其他属性。

我已经追查到这件事了。我已经在对 ExtAudioFileRead() 的调用中进行了时间测量,所以我知道不是我的代码减慢了这个过程。应该是配置问题吧?

非常感谢您的帮助甚至猜测!

干杯, 克里斯托弗

【问题讨论】:

【参考方案1】:

您不应该在音频回调中读取音频文件 - 您应该在另一个线程中缓冲并传递样本。

你正在破坏cardinal audio rule #4:

    不要在音频线程上执行文件或网络 IO。 比如读、写或发送。

【讨论】:

感谢您的链接!在音频线程中,所有这 4 个似乎都是要避免的好事情。然而,很难相信每个 Objective-C 调用都需要一个锁。我使用 Objective-C++ 来避免需要的 Obj-C 开销。但是每次通话都被锁定比我以前知道的还要糟糕。这是真的吗? Objective C 运行时不会对每个调用进行锁定。但是,如果方法缓存查找失败,或者正在发生其他内存管理活动,则可能会发生这种情况。

以上是关于ExtAudioFileRead 太慢。如何让它更快?的主要内容,如果未能解决你的问题,请参考以下文章

loadNibNamed 方法太慢 - 如何让它更快?

怎么更改电脑上的鼠标箭头,让它更可爱?

请简化我的代码或让它更高级 Python 程序员

Flask | 简单封装那个request,让它更通用

使用扩展音频文件服务 (ExtAudioFileRead) 读取音频

使用 ExtAudioFileRead 循环 AAC 文件 - 错误?