• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 iOS 上使用 Audio Queue 播放音频一段时间后静音

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:58:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在编写一个 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap