gstreamer学习笔记 之 同步

本文详细介绍了GStreamer的同步机制,包括GstClock、GstBuffer时间戳、延迟计算与实现,以及同步策略。GstClock是全局时钟,用于pipeline中所有元素,GstBuffer的pts和dts用于媒体呈现和处理时间。管道延迟主要发生在sink中,通过预送(preroll)阶段确保元素同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、gstreamer 的同步机制由如下几个组件组成


  • GstClock,是全局的,用于pipeline中的所有elements。
  • GstBuffer的timestamps。
  • buffers之前的NEW_SEGMENT event。

2、GstClock

    GstClock是精确到纳秒的表示当前时间的一个计数。其值用absolute_time表示

  •  系统时钟,精度是微妙。(gstSystemClock)
  •  音频设备时钟,精度是纳秒。(gstAudioClock)
  •  网络时钟,(GstRtpClock、GstNetClientClock)
  •  其它任何element提供的时钟。
     选择时钟源
  • 从媒体流的最上(most upstream)开始选择一个可以提供时钟的元素;
  •  如果管道中所有元素都不能提供时钟,则采用系统时钟。
     时钟发布       
        为了同步不同的元素,管道需要负责为管道中的所有元素选择和发布一个全局的时钟。
        时钟发布的时机包括:            
  •  管道进入PLAYING状态;
  •  添加一个可以提供时钟的元素;
  •  发送一个GST_MESSAGE_CLOCK_PROVIDE消息——>bus——>通知父bin——>选择一个clock——>发送一个NEW_CLOCK消息——>bus;
    时钟移除    
    发送一个CLOCK_LOST消息——>PAUSED——>PLAYING

3、running_time
      pipeline会维护一个基于选定时钟的running_time,running_time指的是pipeline处于Playing运行状态时的时间总和, 计算方法如下:

  • 如果pipeline处于NULL或者READY状态则running_time处于undefined。
  • PAUSE状态下,running_time的值保持不变,如果处于刚开始启动时的PAUSE状态,running_time的值为0。
  • flushing seek之后,running_time被置为0。这需要向所有被flush的elemnt指定一个新的base_time。

上述的计算方法在pipeline的状态从Playing状态设定为Pause状态时记录running_time,当从Pause状态转变为Playing状态后基于absolute_time恢复running_time。针对Pause后继续计数的clock,比如system clock,以及Pause后不再计数的clock,比如audioclock都是适用的。

running_time = absolute_time - base_time;

 如果pipeline采用系统时钟,由于系统时钟一直都在变,即absolute_time在变,pause状态时running_time不变,则base_time=absolute_time-running_time,此时base_time会变;
 如果pipeline采用的audioclock,absolute_time会根据输出的sample数来计算,所以pause状态时不会变,又pause状态时running_time不变,则base_time=absolute_time-running_time,此时base_time也不会变;

4. stream time

    Stream time 可理解为在stream中的位置,其值介于零和媒体文件总长度之间。
    stream time可以用于:
        - 响应POSTION query;
        - seek中的位置;

   


5、GstBuffer中的时间戳

  1. struct GstBuffer {   
  2.   /* the parent structure */  
  3.   GstMiniObject          mini_object;  
  4.   
  5.   /* pointer to the pool owner of the buffer */  
  6.   GstBufferPool         *pool;  
  7.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值