1. 获取duration的话,有几个途径:(1)在bus上监听GST_MESSAGE_DURATION,如果有这个消息到来,用gst_message_parse_duration就可以获得。但是往往element不会发这样的message出来 (2)用gst_query_new_duration新建一个duration query,然后用gst_element_query(pipeline, query)查询即可。这种方法较为常用。一般可以在pipeline所有element都link好了,pipeline状态是RUNNING的时候,就可以查询了。
2. 获取当前播放的position,也有几种办法:(1)如果pipeline中element支持GST_QUERY_POSITION,那么可以进行查询得到。一般来说都是sink element提供position查询,因为数据从src开始,一路经过demux,decode,这中间都需要消耗时间,所以如果是非sink element提供position的话,那是不准的。 (2)如果不能query,那我现在的做法是:在sink element上add event和buffer probe。在event probe中监听NEWSEGMENT event,一般刚开始播放的话,NEWSEGMENT中的start都是0。收到该event做一些相应的动作;然后在buffer probe中将第一个buffer的timestamp记录下来,然后针对后续的buffer,就可以和第一个buffer的timestamp做减法,得到差值除以duration,就是当前的position。注意如果播放中途收到NEWSEGMENT event,那么,第一个buffer的timestamp要重新进行计算,然后最后计算position的时候记得加上NEWSEGMENT中的start,再去除以duration,这才正确。
2. 获取当前播放的position,也有几种办法:(1)如果pipeline中element支持GST_QUERY_POSITION,那么可以进行查询得到。一般来说都是sink element提供position查询,因为数据从src开始,一路经过demux,decode,这中间都需要消耗时间,所以如果是非sink element提供position的话,那是不准的。 (2)如果不能query,那我现在的做法是:在sink element上add event和buffer probe。在event probe中监听NEWSEGMENT event,一般刚开始播放的话,NEWSEGMENT中的start都是0。收到该event做一些相应的动作;然后在buffer probe中将第一个buffer的timestamp记录下来,然后针对后续的buffer,就可以和第一个buffer的timestamp做减法,得到差值除以duration,就是当前的position。注意如果播放中途收到NEWSEGMENT event,那么,第一个buffer的timestamp要重新进行计算,然后最后计算position的时候记得加上NEWSEGMENT中的start,再去除以duration,这才正确。