iphone - 由于流延迟,AudioQueueBufferRef 为空

标签 iphone ios audio audioqueue audioqueueservices

我有 3 个 audioQueueBufferRef 来填充我的音频队列,当数据足够快时,一切都很好。但有时 outputCallback 要求在没有更多数据时填充缓冲区。在这种情况下,我不会将某些东西排入队列,并且不再调用回调。 (普通的 ?)

在此之后,我使用 2 个缓冲区和后来(在另一个滞后之后)1 个缓冲区运行,最后没有更多的缓冲区有回调导致没有声音。

我尝试将空的 audioQueueBufferRef 存储在一个数组中,并在我有数据要填充时调用它们。但由于数据来得不够快,缓冲区只会“吃掉”我剩下的少量数据,声音也很迟钝。

当要填充的数据不足时,最好的方法是什么?

我发现的最好的方法是让缓冲区在没有回调的情况下死掉,让剩余的缓冲区完成工作,直到每个缓冲区都为空。在此之后我停止音频队列,存储一些数据并再次播放。请注意,我必须调用 AudioqueueStop() 因为当每个缓冲区都是空的并且我重新填充它们时,没有声音出来。这是正常的吗?

一般来说,我是用好方法还是有更好的方法?
是否有一个回调检测到我所有的 audioqueueBufferRef 都死了(没有回调运行)?
2.

最佳答案

我在 playroutine 中尝试了这个来为你测试一个解决方案:

cnt++;
if (cnt > 5) {
    inBuffer->mAudioDataByteSize = 4;

    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
    cnt = 0;
    return;
}

它模拟每 5 次 AudioQueue 请求缓冲区时数据到达太晚。请注意,我将 mAudioDataByteSize 设置为 4,这是 2 channel 16 位波形文件的最小样本大小。如果将大小设置为零,则队列将终止并返回错误消息“kAudioQueueErr_BufferEmpty”,因此您确实需要提供数据,尽管您没有任何要提供的数据。如果你仔细想想,这是有道理的。

也许您甚至可以调整代码来估计您需要等待多长时间才能获取数据,假设您将在大约 2 毫秒内获得更多数据。然后,您可以将缓冲区大小设置为比该时间少一点的样本数。如果您正在播放 2 channel 16 位 44100 Hz 波形歌曲,2 毫秒将相当于 44100 Hz * 0.002 秒 = 88、88 * 2 channel *(16 位/8)= 353 字节的缓冲区大小。

关于iphone - 由于流延迟,AudioQueueBufferRef 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19511842/

相关文章:

ios - 使用 Swift 在 xcode 6 中将背景添加到 ios 应用程序

删除应用程序后的iPhone徽章号码

ios - 从通过 Multipeer 连接连接的两个设备中的任何一个调用

java - 尝试播放 AudioClip 时出现 NullPointerException

ios - AVPlayer,长时间停顿,然后恢复=故障

iphone - 是否可以替换已发布的 iPhone 应用程序中的屏幕截图?

iphone - 使用 SpriteKit 驱动计算

html - 在 iOS 应用程序中显示丰富内容的最佳方式是什么?

ios - Objective C ViewController 意外旋转到 Landscape

android - 如何使用带有 setAudioAttributes 的闹钟音量来播放铃声?