视频播放简单原理
前言
前段时间做了一个直播模块,没有意外都是用第三方服务实现的,基本都是业务的东西,有时间就开始研究下相关的技术,不能一直做黑盒程序猿啊。
这篇文章主要是记录视频播放的简单原理,很多内容都是摘录自雷神等人的博客,希望不会被怪罪。想要深入研究很推荐去雷神的专栏看一下(https://blog.csdn.net/leixiaohua1020),在此缅怀这位无私智者。
视频播放基本流程

图1、视频播放流程图
- 解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据,常用协议:HTTP、RTMP、MMS等;
- 解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据,常见视频格式:MP4、MKV、FLV、RMVB等
- 解码(视、音频解码):将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据,常见解码:视频编码H264->像素数据YUV/RGB、音频编码AAC->采样数据PCM
- 音画同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来,以FFmpeg库为例,利用时间戳去同步二者:PTS(Presentation Time Stamp 显示时间戳)、DTS(Decoding Time Stamp 解码时间戳);
- 终端设备播放:显卡、声卡对视(YUV、RGB)音频(PCM)的输出。
基本概念
- 分辨率:指每一帧画面的大小,宽乘高等于若干像素。目前主流的高清格式通常为:720p(1280×720)、1080p(1920×1080)、2K(2560x1440)、4K(4096×2160)
- 码率(比特率,bit per second / bps / bit rate):指单位时间传输的或解码的位数。码率越大,说明单位时间内取样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高。
- 帧率(frames per seconds / fps):指播放时每秒移动多少帧。通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧;视频帧率影响的是画面流畅感,也就是说视频帧率超高,表现出来的效果就是:画面越显得流畅。一般NTSC①是30,PAL②是25,帧速太低则画面不连续播放的流畅性就差,所以要恰到好处才行。
- 采样率(sample rate):指每秒采集的次数,这个是指音频的,采的越多,声音质量越好,当然体积也会大。
码率影响体积,与体积成正比;码率越大,体积越大;码率越小,体积越小。
帧率影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。
分辨率影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。
常用流媒体协议
不管是观看视频还是直播,大多数都需要通过网络传播,服务器与客户端都需要遵循一定的协议才能实现数据的传输与解析。目前已经有很多流媒体协议(如表1所示),各有优劣,将来还会有更多的机构制定、推出不同的协议,以解决现有的问题。
基于TCP的协议传输可靠,但是会有抖动、延迟等问题。基于UDP的协议虽然抖动和延迟情况会好些,但是不够可靠存在丢包的情况。所以不能说哪个协议最好,只能根据自身业务需求选择一种适合的协议,亦或是自行制定协议,在封装可靠的UDP连接等。
表1、常见流媒体协议
| 名称 | 推出机构 | 传输层协议 | 客户端 | 目前使用领域 |
|---|---|---|---|---|
| RTSP+RTP | IETF | TCP+UDP | VLC, WMP | IPTV |
| RTMP | Adobe Inc. | TCP | Flash | 互联网直播 |
| RTMFP | Adobe Inc. | UDP | Flash | 互联网直播 |
| MMS | Microsoft Inc. | TCP/UDP | WMP | 互联网直播+点播 |
| HTTP | WWW+IETF | TCP | Flash | 互联网点播 |
| HLS | Apple Inc. | TCP | iOS, macOS | 互联网直播+点播 |
常用封装
一般我们所说的视频包括画面和声音,二者分开的话顶多算是图片和音频,封装便是把画面和声音打包到一起组成视频文件,解封装便是打包的逆过程,将画面和声音分开,播放是交给不同的设备输出。视频封装同样有很多格式,平时都是以文件后缀就可以区分,如常见的:.mp4、.flv、.rmvb等等。支持不同的音视频编码决定其最终的画质和音质;支持流媒体协议与否,决定其能不能以流媒体形式传输。
表2、常见视频封装格式
| 名称 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 |
|---|---|---|---|---|---|
| AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT下载影视 |
| MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 | 互联网视频网站 |
| TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, | IPTV,数字电视 |
| FLV | Adobe Inc. | 支持 | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 | 互联网视频网站 |
| MKV | CoreCodec Inc. | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 |
| RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT下载影视 |
视频编码
如果视频中每一帧的画面都是原图片的话,最后生成的视频将是巨大的。在一些视频中往往会有一段时间,画面的大部分内容都是相同的,这个时候就可以进行前后画面的对比,进行一定的压缩操作以达到节省空间的作用,这种压缩操作就是视频编码。不同的压缩算法,就产生了不同的编码格式,应用的比较广泛的就是H.264了,接下来也会深入的去学习一下。
表3、常见视频编码
| 名称 | 推出机构 | 推出时间 | 目前使用领域 |
|---|---|---|---|
| HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
| H.264 | MPEG/ITU-T | 2003 | 各个领域 |
| MPEG4 | MPEG | 2001 | 不温不火 |
| MPEG2 | MPEG | 1994 | 数字电视 |
| VP9 | 2013 | 研发中 | |
| VP8 | 2008 | 不普及 | |
| VC-1 | Microsoft Inc. | 2006 | 微软平台 |
音频编码
音频编码和视频编码的道理一个样,对原始音频数据的压缩,为的也是节省空间,AAC和MP3应用广泛。
表4、常见音频编码
| 名称 | 推出机构 | 推出时间 | 目前使用领域 |
|---|---|---|---|
| AAC | MPEG | 1997 | 各个领域(新) |
| AC-3 | Dolby Inc. | 1992 | 电影 |
| MP3 | MPEG | 1993 | 各个领域(旧) |
| WMA | Microsoft Inc. | 1999 | 微软平台 |
音画同步
音视频是不同设备去采集,音视频编码解码时间不一致,流媒体传输将音视频分开传输等等原因,不作处理,声音和画面播放往往是不同步的,直接播放肯定是没法看的。采集的时候需要给每个视频帧和音频样本加上时间戳,再通过一个基准将音画进行同步处理,解决方案有如下几种:
- 将视频同步到音频上,就是以音频的播放速度为基准来同步视频。视频比音频播放慢了,加快其播放速度;快了,则延迟播放。
- 将音频同步到视频上,就是以视频的播放速度为基准来同步音频。
- 将视频和音频同步外部的时钟上,选择一个外部时钟为基准,视频和音频的播放速度都以该时钟为标准。
后话
经过一段时间的学习,反反复复看雷神的博客,写了些代码实践验证,音视频这个领域广度和深度是我无法想象的,还是要靠慢慢的积累。文中有什么错误和不足欢迎指正。