• GStreamer如何获取播放的duration和当前的播放position?


    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,这才正确。 
  • 相关阅读:
    Vue常用语法
    Vue--过滤器、指令、插件
    使用vue-cli创建项目
    electron Ctrl+滚轮事件 放大缩小
    axios 处理超时问题 记录
    electron 清除所有cookie记录
    electron用默认浏览器打开链接的3种实现方式
    electron 不支持Ctrl+滚动条放大缩小,自己动手做了一个react组件
    排序算法记录
    umi react 集成 spreadjs
  • 原文地址:https://www.cnblogs.com/super119/p/1924441.html
Copyright © 2020-2023  润新知