本文翻译自gstreamer源代码中的文档,原文的路径是gstreamer/docs/design/part-synchronisation.txt。
其中有一些繁琐的时间值推算。对于我们分析av同步不实用,这里不做介绍。
同时参考网上资料http://blog.youkuaiyun.com/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文档)
音频设备。
基于网络的数据包,比如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
其中有一些繁琐的时间值推算。对于我们分析av同步不实用,这里不做介绍。
同时参考网上资料http://blog.youkuaiyun.com/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