参考时钟与时间戳处理
1、参考时钟
用于作为系统的唯一参考,一般以系统启动时间开始计时,具体数值影响不大,主要是做一个比较和参考作用。
参考时钟设计时主要保证稳定性,尽量不产生时钟偏移。
2、时间戳
时间戳有两种,
1)同步时间戳
之所以称为同步,其作用是同步多个流之间的操作,如果只有一个流,显然这个时间戳是没有意义的。一般通常用于音频和视频的同步播放。
对于实时采集的音视频数据的时间戳可以简单的使用采集时刻的参考时钟值。
对于文件素材的音视频数据的时间戳,第一帧使用参考时钟,后续按照流时间戳累加就可以了。
对于网络接收的音视频数据的时间戳,使用接收时间作为时间戳,后续需要利用流时间戳来同步音视频。
音视频的播放时刻应该为时间戳加上各项处理延迟。
2)流时间戳
用于标明音频或者视频流的起止时间,主要作用是判断是否存在流数据丢失。
音视频流第一帧的流时间戳具体取值关系不大。譬如视频流第一帧流时间戳为0,帧持续时间40ms;第二帧流时间戳为40,第三帧依次递加。
在整个处理过程中,流时间戳不改变。对于音视频采集,可以判定是否出现丢帧现象;对于网络音视频流发送过程中,如果接收的流时间戳出现缺口,说明数据流出现丢失现象。不必要的时候可以不打。
时间戳由时间基准和时间戳值组成。
时间基准:对时间单位(s)划分的标准。
例如,1/25表示每秒分为25个单位,每个单位时间间隔包含1个单位。
3001/90000表示每秒分为90000单位,每个单位时间间隔包含3001个单位。
时间戳值:基于时间基准的时间表示,也即多少个单位时间间隔。
1)时间戳的作用是用于精确标记音视频流的相对位置和持续时间。
2)基于时间基准使用时间戳,而不是直接使用整数值的意义在于,时间戳可以避免不能够整除的情况。
3)不同的时间基准之间的时间戳转换存在误差,应该避免不必要的转换。
如果的确需要转换,应该保证转换后的时间戳不小于转换前。
4)不同时间基准直接的时间戳比较,应该首先转换到划分更细的单位上(1/1hns)进行。
5)系统时钟相当于1/1000的时间戳,音视频播放同步,实际就是流自身的时间戳与系统时间戳的一个比较。
由于时间戳转换存在误差,所以播放同步实际也是存在误差。所以不要纠结于等号,而是尽量设置一个可容忍的误差时长。
ffmpeg中时间戳转换
AVFormatContext->AVPacket ->AVFrame ->AVPacket->AVFormatContext
AVStream AVCodecContext AVStream
解码过程:由于AVStream与AVCodecContext是AVFormatContext在文件解析过程创建的,因此两者的time_base应该是一致的。
AVPacket到AVFrame的时间戳值不变。
编码过程:AVCodecContext的time_base由用户设置(默认是1/90000),AVStream中的time_base是默认 值1/90000(ffmpeg在write_header会修改以匹配AVCodecContext值),两者值不一定相等,因此需要进行时间戳值转 换。