gstreamer AV sync

Gstreamer的时钟机制使用GstClock精准到纳秒来表示时间。在视频同步过程中,ffmpegdemux插件在seek操作或播放开始时计算latency并发送event,这些值沿着流程传递并用于AV同步,其中segment.start参数来源于ffmpeg demux模块。
摘要由CSDN通过智能技术生成
本文翻译自gstreamer源代码中的文档,原文的路径是gstreamer/docs/design/part-synchronisation.txt。
其中有一些繁琐的时间值推算。对于我们分析av同步不实用,这里不做介绍。
同时参考网上资料http://blog.csdn.net/shenbin1430/article/details/4291963
有兴趣的可以自行阅读。
经过对代码的实际跟踪,发现tizen中gstreamer的同步机制和文档描述有出入。
因此这里不赘述文档内容。只在跟踪代码的基础上,着重介绍tizen中实际运行机制。
Gstreamer 的同步有很多扩展功能。这里只介绍tizen中用到的主干功能。
同时由于理解不够全面,难免有错误。尤其是音频部分。仅供参考。

一, 基本概念
1、gstreamer在pipline中传递如下两种内容:
(1)events 

----   NEW_SEGMENT    (NS)  
gstreamer把数据流分成segment. 每次开始播放,或者有seek操作,都会有新的segment产生 .
        segment包括了有效的时间戳范围(start/stop );stream_time; 需要的回放率以及已经应用的回放率。
NS:  NEWSEGMENT event preceeding the buffers.
NS.start: start field in the NEWSEGMENT event 
NS.stop: stop field in the NEWSEGMENT event 
NS.rate: rate field of NEWSEGMENT event 
NS.abs_rate: absolute value of rate field of NEWSEGMENT event 
NS.time: time field in the NEWSEGMENT event 
NS.accum: total accumulated time of all previous NEWSEGMENT events. This field is kept in the GstSegment structure. 


(2)    buffers            
有效数据的buffer,里面有时间戳,根据此时间戳同步 。
只有处于NEW_SEGMENT 的start 和stop 之间的buffers 是可以被显示的,否则将被丢弃或者裁剪。
典型的流如下图 所示:

2,  几个时钟概念

图1, Gstreamer时钟和变量图(引自Gstreamer文档)



Gstreamer 所使用的时钟变量GstClock是精确到纳秒的表示当前时间的一个计数。这个计数的源的选择如下:


系统时间,精度是微妙。 
音频设备。 
基于网络的数据包,比如RTP数据包。 
其它。 



gst中使用系统时钟作为GstClock。通过gst_clock_get_time()函数获取
图一中:
base time: 新的segment生成时的那一瞬间的系统时间。
Running time: 媒体处于PLAYING状态时流逝的时间。
stream time: 在整个媒体流中的时间值。


二, 视频同步原理

对视频同步来说,最基本的原理如下
1, 在文件开始播放的时候,会记录播放开始瞬间的basetime. 这个时间是通过读取systime来获得的系统时间。 
然后根据从文件的哪个地方开始播放的,记录下streamtime,记录在Ns.start.  也就是说,Ns.start记录的是开始播放时,文件流中的streamtime. 
由此可见,Ns.start和basetime是在同一时刻记录下的。
这样,streametime 为 (Ns.start +  X纳秒)的视频帧就应该在 系统时间为(basetime
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值