2013-10-22 21 views
0

我有3个audioQueueBufferRef来填充我的音频列表,并且每个数据都足够快时,每个作品都很好。但有时outputCallback会在没有更多数据时要求填充缓冲区。在这种情况下,我不会排队,回调也不会被调用。 (正常?)AudioQueueBufferRef空流由于流延迟

在这之后,我运行了2个缓冲区,之后(在另一个延迟之后)1个缓冲区,最后没有更多的缓冲区有回调导致没有声音。

我尝试将空的audioQueueBufferRef存储在数组中,并在我有数据填充时调用它们。但是由于数据速度不够快,缓冲区只会“吃掉”我剩余数量较少的数据,并且声音很慢。

当数据填满时,最好的方法是什么?

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

一般情况下,我会这样做的好方法还是有更好的方法? 是否有一个回调检测到我的所有audioqueueBufferRef已经死了(没有回调运行)? 2.

回答

0

我在playroutine尝试这个测试的解决方案为您提供:

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

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

它模拟数据到达太晚每5时AudioQueue要求一个缓冲器。请注意,我将mAudioDataByteSize的大小设置为4,这是2通道16位波形文件的SMALLEST样本大小。如果将大小设置为零,则队列将会死亡并返回错误消息'kAudioQueueErr_BufferEmpty',所以您确实需要提供数据,尽管您没有任何要提供的数据。如果你仔细想想,这是有道理的。

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

0

我认为回调是以您设定的频率调用的,如果您无法及时填充数据,则声音不正常。你的数据来自网络吗? 我遇到了和你一样的情况,我的解决方案是记录一个静音数据包数据,当我没有音频数据填写时,我使用静音数据。