OStack程序员社区-中国程序员成长平台

标题: ios - 在 iOS 上使用 Audio Queue 播放音频一段时间后静音 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 07:58
标题: ios - 在 iOS 上使用 Audio Queue 播放音频一段时间后静音

我正在编写一个 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-推荐答案


问题已解决。

关键是,你不能让音频队列缓冲区等待,你必须一直喂它,否则它可能会被静音。如果你没有足够的数据,用空白数据填充它。

所以下面的代码应该改一下:

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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4