LinuxSir.cn,穿越时空的Linuxsir!

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

音频/视频同步算法

[复制链接]
发表于 2005-8-28 16:32:24 | 显示全部楼层 |阅读模式
请教一个音视频同步算法。
情况是这样的,我们同步网络把音频/视频分开传送到接收端,现在的问题关键问题的如果对这股流进行同步播放。
我现在的算法是这样的:
在发送方:
   对于相同时刻的音频/视频帧,打上相同的时间戳(系统时间)
接收方:
   保存两个队列,audio/video分别用来存放还未播放的音频和视频
1。当每接收到音频帧的时候,遍历此时的video队列,将此音频帧的时间戳跟每个视频帧的时间戳进行比较:
   1)如果音频帧的时间在这个视频帧的前面,帧播放该音频
   2)如果音频跟视频的时间戳相差在某个可以接受的误差内,则同时播放该音频/视频(并将视频帧从video队列中删除)
   3)如果视频时间在前,则播放视频帧(并将视频帧从video队列中删除)
      如果video队列中的最后一帧的时间都在这个audio帧之前,在此时会把整个video队列中的帧播放完,此时video队列将为空,那么将这个音频放入audio队列。
2.对接收到视频帧的时候,也做类似的处理。
现在我们在局域网内测试,没有任何的问题。
但是我自己发现这个算法还是有些问题:
   1)音频和视频发送帧的频率不一样,假如audio的频率是video的3倍,那么播放时,会是3个3个音频帧地播放
   2)如果网络比较差的话,只有一个通道是好的时,将不能正常播放。我现在采取的方法是设定一个时间,如果没有接收到帧的话,就认为该通道是断开的,然后就只管自己播放。这样可以解决一些问题,但是在这不判断这个流是断开的过程中,另外一个流的播放是停止的,这是个大问题。我看网络播放方面的软件都没有这个问题,它们的音频给视频似乎是各自独立的,除了在同步的时候。
发表于 2005-8-29 09:10:18 | 显示全部楼层
最好采用多线程来实现。音视频的接收和播放放在独立的线程里。而且可以设定播放音频的线程的优先级别高些,这样即使网络比较差很多包丢掉的话,那么你应该可以得到比较连续的声音。即使没有图像。

其实对于实时的应用,因为发送方可以保证音视频发送的同步,甚至在接收端可以考虑不采用几个线程间的同步问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 16:02:26 | 显示全部楼层
Post by realtang
最好采用多线程来实现。音视频的接收和播放放在独立的线程里。而且可以设定播放音频的线程的优先级别高些,这样即使网络比较差很多包丢掉的话,那么你应该可以得到比较连续的声音。即使没有图像。

其实对于实时的应用,因为发送方可以保证音视频发送的同步,甚至在接收端可以考虑不采用几个线程间的同步问题。

谢谢,确实可以考虑不同步的方式,先试试看
回复 支持 反对

使用道具 举报

发表于 2005-8-30 20:22:12 | 显示全部楼层
这才是高人呢!
回复 支持 反对

使用道具 举报

发表于 2010-1-2 13:33:34 | 显示全部楼层

门禁可视对讲中的音视频同步

回复 支持 反对

使用道具 举报

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

本版积分规则

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