目录
简介
播放器的音视频同步无外乎三种方式:视频往音频同步、音频往视频同步及音视频同时往系统时钟同步。大部分播放器都是采取第一种方式,例如ffplay、EXOPlayer、Nuplayer、ijkplayer等。而VLC就比较不合群了,它采用音视频同时往系统时钟同步的方式,下面结合代码简单介绍下音画同步的原理。
VLC专门有一个clock.c文件,用来维护时钟信息,其核心结构体如下,阐述了VLC音画同步的核心思想:
|
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()函数中:
|