平时我们播放一个视频(本地或者在线)的时候,有想到过这个视频是如何播放出来的吗? 其实从我们点击播放开始,到最后我们看到视频,这中间经历了一系列的流程。你也许会很惊讶吧,我就点击了一个视频观看,没想到中间还会有这么多的过程呢!这些不可见的过程要感谢工程师们默默的付出。
本文将就在线播放视频播放的流程做一些介绍:
流媒体协议解析
当你点击在线视频的时候,视频很快就会播放出来。你也许会很诧异一个大的视频文件咋就立即播放了呢,这视频文件是已经下载到本地了吗?其实则不然,播放器只是播放了传输了那一部分,这得益于流媒体协议。
何为流媒体协议呢? Real-time Transport Protocol是用于Internet上针对多媒体数据流的一种传输协议(属于应用层),是指将一连串数据压缩后,经过网络分段发送,即时传输以供观看音视频的一种技术。通过使用 streaming media 技术,用户无需将文件下载到本地即可播放。
那第一步就是流媒体协议解析,目的是去除一些信令数据(播放,暂停,停止等控制命令),提取出音视频数据。
解析封装格式
上步解析协议之后,拿到了音视频数据。这些音视频数据按照一定规则组装成mp4、flv、m3u8等格式的文件。这一步要做的是解封装,即从一个容器里面,提取出音频数据、视频数据以及音视频数据对应关系。
音视频解码
上一步拿到的音视频数据是没法渲染播放的,原因是为了降低始视频数据占用存储空间,视频文件通过编码压缩形式来使存储空间变小。也就是我们拿到的是压缩后的数据,这一步要做的就是通过压缩算法,还原出音视频的原始数据。对应的视频数据通过H.264/AVC、HEVC/H.265等还原出原始的视频数据(YUV或RGB格式),压缩的音频数据通过AAC还原出原始的音频数据(PCM格式)。
音视频同步
这一步要做的就是视频数据与音频数据的同步问题,即视频播放的画面与播放的声音对应的上。 常用的同步方式有如下三种: - 音频为主时钟(视频同步到音频) - 视频为主时钟(音频同步到视频) - 外部时钟(系统时间)为主时钟(视频、音频同步到外部时钟)
主流的是音频为主时钟,即视频播放过快,则重复播放上一帧,以等待音频;如果视频播放过慢,则丢帧追赶音频。
渲染与播放
同步后的数据,视频数据送到显卡渲染,音频数据送到声卡播放。
总结
一个完整的在线播放流程包括:解析协议 -> 解析封装格式 -> 音视频解码 -> 音视频同步 -> 渲染与播放。
在解析出音频数据之后,我们可以再做一些特殊处理,比如对视频数据添加一些滤镜、特效转场等,对音频数据做一些降噪等操作。