一、视频播放流程
播放一个视频,一般分一下几步完成
解复用(Demux):在媒体文件中将音频数据、视频数据、字母数据分离出来。
二、播放参数说明
视频帧率:一秒钟需要显示的画面,比如25FPS,意思就是一秒钟需要显示25张画面,
那么一张画面的持续时间就是1000/25=40ms。
音频采样率:一秒钟播放的样品个数。
音频数据公式:采样率x通道数*采样深度/8*数据持续时间。
三、音画同步阐述
依据视频帧率以及音频的帧率即可控制播放速度。声卡和显卡均是一帧数据来作为播放单位,如果单纯依据帧率来控制播放,理论上是可以控制音画同步的。
比如深度16bit,一个8K单声道的PCM的数据和25FPS的视频流为例:
一个512byte的PCM音频帧的播放时长:512*1000/(8000*16/2)=32ms
一帧视频画面的持续时间为1000/25 = 40ms
故在理想情况下,音视频完全不同,音视频播放过程如下:
但是实际情况下,如果用上面这种方式的话,慢慢的就会出现音视频不同步的情况,可能是视频播放快了,可能音频播放快了。原因如下:
1.一帧的播放时间,难以精准控制。音视频解码及渲染的耗时不同,可能造成每一帧输出的时间长短不一样,长久积累误差,不同步便会越来越明显。
2.音频数据输出是线性的持续不断的,但是视频输出不是线性的,视频渲染可能快,可能慢,从而导致音视频显示帧率上出现偏差。
所以,解决音视频播放同步的问题,引入了时间戳。
录制的时候:选择一个参考时钟,要求参考时钟上的时间是线性递增的,编码时依据参考时钟上的每个音视频数据块打上时间戳。
播放的时候:依据音视频时间戳及参考时钟,来调整播放速度。
所以,视频和音频同步实际上时一个动态的过程,一直围绕理想状态上不断调整音视频播放速度,来消除时间累计误差。
四、同步策略
实现 音视频同步,在播放时候需要选择一个参考时钟,读取帧上的时间戳,同时根据参考时钟来动态调整播放速度。参考时钟一般选择以下两种
1.将视频同步到音频上:以音频的播放速度为基准来同步视频。
2.将视频和音频同步到外部的时钟上:选择一个外部时钟为基准,视频和音频的播放速度均以该时钟为标准。
当播放源比参考时钟慢时,加快播放速度或者丢弃,播放快了则延迟播放速度。考虑人对声音的敏感度比较高,频繁调节音频会带来较差的体验,并且音频播放时钟为线性增长,一般的做法都是以时钟作为参考时钟,将视频同步到音频上。