我有一个语音聊天接收rtp数据包(每个数据包包含20ms的语音afaik),将它们添加到缓冲区并播放出去。openAL - 播放缓冲区时发出波涛汹涌的声音
如果我在缓冲一个数据包后直接调用alSourcePlay()(我有5个缓冲区,并且每个缓冲区都有一个数据包,这些数据包在播放数据包后会被重新使用),因为它会在另一个数据包到达之前播放缓冲区。
我的问题是你如何处理这个问题,以便音频不会发生波动?
我有一个语音聊天接收rtp数据包(每个数据包包含20ms的语音afaik),将它们添加到缓冲区并播放出去。openAL - 播放缓冲区时发出波涛汹涌的声音
如果我在缓冲一个数据包后直接调用alSourcePlay()(我有5个缓冲区,并且每个缓冲区都有一个数据包,这些数据包在播放数据包后会被重新使用),因为它会在另一个数据包到达之前播放缓冲区。
我的问题是你如何处理这个问题,以便音频不会发生波动?
如果您平均每分钟获得小于50个20ms的数据包,那么必须在某个地方暂停。如果您在播放数据包之前暂时存储数据包,则可以查找自然暂停(静音),并将间隙与自然暂停相结合,这样听起来更自然。你存储得越多,播放效果越好,但做得太多,延迟会变得不愉快。
你需要的缓冲量是一个品味问题。这是更丑陋,声音不稳定或响应延迟。我想你将不得不设计它,所以它是一个变量,然后尝试找到'快乐媒体'
如果你是最短的,每秒10个数据包,然后一个更简单的方案表明自己:在每个数据包之间放置一个4ms的延迟,这应该是不可检测的。运行1秒。查看有多少数据包已累计(如果只有40个数据包,则该数据包将为零)调整数据包间延迟以进行补偿。继续。
哦对不起btw我的意思是我得到每秒40-50包LOL:P你需要多少缓冲区不要丢弃数据包,因为缓冲区已满? – KaiserJohaan 2011-05-05 14:55:28
这就是我对你的理解。 40包/秒= 800ms。所以你错过了200ms。除以50得到4ms。如果你是短包,你将永远不需要扔掉它们。问题是要替换丢失的数据包。 – ravenspoint 2011-05-05 15:05:35