我正在编写一个 iOS 上的实时音频播放程序。
从peer接收音频RTP包,放入音频队列播放。
开始播放时,声音正常。但是 1 或 2 分钟后,声音变小了,而且 AudioQueue API 没有报错。回调函数继续正常调用,没有异常。
但它只是静音了。
我的回调函数:
1:循环直到有足够的数据可以复制到音频队列缓冲区
do
{
read_bytes_enabled = g_audio_playback_buf.GetReadByteLen();
if (read_bytes_enabled >= kAudioQueueBufferLength)
{
break;
}
usleep(10*1000);
}
while (true);
2:复制到AudioQueue Buffer,并入队。这个回调函数一直正常运行,没有报错。
//copy to audio queue buffer
read_bytes = kAudioQueueBufferLength;
g_audio_playback_buf.Read((unsigned char *)inBuffer->mAudioData, read_bytes);
WriteLog(LOG_PHONE_DEBUG, "AudioQueueBuffer(Play): copy [%d] bytes to AudioQueue buffer! Total len = %d", read_bytes, read_bytes_enabled);
inBuffer->mAudioDataByteSize = read_bytes;
UInt32 nPackets = read_bytes / g_audio_periodsize; // mono
inBuffer->mPacketDescriptionCount = nPackets;
// re-enqueue this buffer
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
Best Answer-推荐答案 strong>
问题已解决。
关键是,你不能让音频队列缓冲区等待,你必须一直喂它,否则它可能会被静音。如果你没有足够的数据,用空白数据填充它。
所以下面的代码应该改一下:
do
{
read_bytes_enabled = g_audio_playback_buf.GetReadByteLen();
if (read_bytes_enabled >= kAudioQueueBufferLength)
{
break;
}
usleep(10*1000);
}
while (true);
改成这样:
read_bytes_enabled = g_audio_playback_buf.GetReadByteLen();
if (read_bytes_enabled < kAudioQueueBufferLength)
{
memset(inBuffer->mAudioData, 0x00, kAudioQueueBufferLength);
}
else
{
inBuffer->mAudioDataByteSize = kAudioQueueBufferLength;
}
...
关于ios - 在 iOS 上使用 Audio Queue 播放音频一段时间后静音,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/30794479/
|