我有3个audioQueueBufferRef来填充我的音频队列,并且当数据足够快时,一切工作都很好。但是有时outputCallback会在没有更多数据时要求填充缓冲区。在这种情况下,我不会排队,也不会再调用回调。 (正常吗?)

在此之后,我用2个缓冲区运行,然后(又有一个滞后)运行1个缓冲区,最后没有更多的缓冲区具有没有声音的回调。

我尝试将空的audioQueueBufferRef存储在数组中,并在我有数据要填充时调用它们。但是由于数据的传输速度不够快,因此缓冲区只会“吃掉”我剩余的少量数据,声音会变得迟钝。

数据不足时要去的最佳方法是什么?

我所能找到的最好的办法就是让缓冲区在没有回调的情况下就死掉,并让其余的缓冲区继续工作直到每个缓冲区都为空。此后,我停止audioQueue,存储一些数据并再次播放。注意,我必须调用AudioqueueStop(),因为当每个缓冲区都为空并且我重新填充它们时,没有声音发出。这正常吗?

总的来说,我是做一个好办法还是有更好的办法?
并且有一个回调可以检测到我所有的audioqueueBufferRef都死了(没有运行回调)?
2。

最佳答案

我在playroutine中尝试了此方法,以为您测试解决方案:

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

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

它模拟AudioQueue每隔第5次请求缓冲区到达数据太晚。请注意,我将mAudioDataByteSize设置为4,这是2通道16位wave文件的最小样本大小。如果将大小设置为零,则队列将死亡并返回错误消息“kAudioQueueErr_BufferEmpty”,因此尽管没有数据要馈入,但您确实需要提供数据。如果您考虑一下,这是有道理的。

也许您甚至可以修改代码来估计需要等待多长时间才能获取数据,让我们说您将在2ms左右获得更多。然后,您可以将缓冲区大小设置为小于该时间的采样数。如果您正在播放2通道16位44100 Hz波形歌曲,则2ms等于44100 Hz * 0.002秒= 88、88 * 2通道*(16位/ 8)= 353字节的缓冲区大小。

10-06 00:52