LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1151|回复: 5

音频同步问题(百思不得其解)

[复制链接]
发表于 2010-8-2 08:50:04 | 显示全部楼层 |阅读模式
一个服务端和一个客户端,服务端将音频音频数据发送到客户端,客户端收到音频数据后实时播放,现在存在以下问题(在不同的机器上测试过):

    服务端的采样频率是8000,客户以8000的采样频率播放,但是客户端播放不是快了就是慢了,所以要么就出现停顿,要么时间一长客户端的音频缓冲区就会溢出。

问题分析结果:
    1.经过测试,服务端发送过来确实是精确的以8000为采样频率,每秒收到16000个字节(每个采样点两个字节)。

    2.通过客户端动态调整采样频率可以实现同步,整体思想是当客户端播放速度慢了,就调高采样频率;当客户端速度慢了,就调低采样频率,频率变化范围是(7900~8100)。但是当声音比较丰富的时候,会出现变调。

    3.通过动态加减帧来实现同步,整体思想是当客户端播放速度慢了,就往音频缓冲中插入人为构造的音频数据;当客户端速度慢了,就删掉音频缓冲区一些数据。此方法因为难度较大,同时需要在缓冲区中积累一定量的数据才能进行调整,影响实时性,所以目前未具体实现。



   本人在网上搜索的很长时间也没有什么收获,以至于百思不得其解,在此请教一下大家,希望各位不腻赐教,先谢谢了:

    1. 声卡的频率在不同的机器上会不会有误差,为什么同样的采样频率一段声音,在不同的机器上播放时间会有偏差呢。

    2. 如果声卡确实会有误差,那有没有其他的更好的行之有效的解决办法的。
发表于 2010-8-2 10:52:01 | 显示全部楼层
在客户端,通过增大缓冲区,使用实时API等方法来解决。
回复 支持 反对

使用道具 举报

发表于 2010-8-2 14:52:04 | 显示全部楼层
我也碰到过这个问题。通过本地buffer来控制音频不会少或者溢出,但是会有延时。
不知道realtang所说的实时api是指什么?
回复 支持 反对

使用道具 举报

发表于 2010-8-2 15:09:15 | 显示全部楼层
实时信号队列,线程优先级等。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-3 10:14:21 | 显示全部楼层
谢谢楼上两位的建议,更棘手的是当客户端播放过快,以至于没有音频数据可以播放,这时候声音会出现短暂的停顿。
回复 支持 反对

使用道具 举报

发表于 2010-8-19 14:17:12 | 显示全部楼层
这种问题比较麻烦,通常有几种方法,往往需要配合才能取得好的效果:
1、解决语音片断丢失,比如用一些交错编码、加大延迟等方法;
2、缓冲区接近上溢出时丢弃部分数据,注意要处理得当否则直接砍数据会出现暴音(不能砍编码数据,特别是相关性编码,只能砍解码之后的pcm);
3、缓冲区接近上溢出时通过一些编码库对buffer进行变频,加快播放速度(有失真,但缓冲越大越不明显);
4、收发双方运用静音抑制技术,只传送高于一定门限的音频数据,减少带宽占用以及播放延迟溢出。
5、提高播放线程优先级,采用更大buffer减少调度抖动带来的影响;
6、楼上的方法,用real-time api精确定时,避免人为睡过头导致的缓冲区下溢出。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表