VLC-Android音画同步原理

目录

简介

延伸——buffering机制的影响

延伸——时间转换位置

延伸——pause操作的影响

延伸——delay设置

总结

简介

播放器的音视频同步无外乎三种方式:视频往音频同步、音频往视频同步及音视频同时往系统时钟同步。大部分播放器都是采取第一种方式,例如ffplay、EXOPlayer、Nuplayer、ijkplayer等。而VLC就比较不合群了,它采用音视频同时往系统时钟同步的方式,下面结合代码简单介绍下音画同步的原理。

VLC专门有一个clock.c文件,用来维护时钟信息,其核心结构体如下,阐述了VLC音画同步的核心思想:

typedef struct

{

    mtime_t i_stream;

    mtime_t i_system;

} clock_point_t;

VLC将连续的时间变为离散的clock_point_t,每一个clock_point_t都记录了当前时间点的i_system和i_stream。i_system比较好理解,就是系统时间;i_stream则是片源的时间,或者理解为dts,例如,你在上午10点整播放一个视频,那么第一个clock_point_t的i_system就是上午十点,i_stream则是视频第一帧的dts(大概率是0)。VLC维护这两套时间基准,就是因为视频文件的音视频流只包含stream时间,需要将它转换为系统时间才能够跟系统时钟进行同步。

input_clock_t结构体内部维护了两个clock_point_t,分别名为ref和last。ref用来记录起播或seek后的第一个时间点,last用来记录最近的时间点。这两个clock_point_t的更新策略在input_clock_Update()函数中:

/*****************************************************************************

 * input_clock_Update: manages a clock reference

 *

 *  i_ck_stream: date in stream clock

 *  i_ck_system: date in system clock

 *****************************************************************************/

void input_clock_Update( input_clock_t *cl, vlc_object_t *p_log,

                         bool *pb_late,

                         bool b_can_pace_control, bool b_buffering_allowed,

                         mtime_t i_ck_stream, mtime_t i_ck_system )

{

    bool b_reset_reference = false;

    assert( i_ck_stream > VLC_TS_INVALID && i_ck_system > VLC_TS_INVALID );

    vlc_mutex_lock( &cl->lock );

    //b_has_reference在初始化和seek后被置为false

    //因此起播和seek后b_reset_reference为true

    if( !cl->b_has_reference )

    {

        /* */

        b_reset_reference= true;

    }

    //pts发生跳变

    else if( cl->last.i_stream > VLC_TS_INVALID &&

             ( (cl->last.i_stream - i_ck_stream) > CR_MAX_GAP ||

               (cl->last.i_stream - i_ck_stream) < -CR_MAX_GAP ) )

    {

        /* Stream discontinuity, for which we haven't received a

         * warning from the stream control facilities (dd-edited

         * stream ?). */

        msg_Warn( p_log, "clock gap, unexpected stream discontinuity" );

        cl->i_ts_max = VLC_TS_INVALID;

        /* */

        msg_Warn( p_log, "feeding synchro with a new reference point trying to recover from clock gap" );

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值