logo头像

最可怕一生碌碌无为,还说平凡难能可贵!

视频播放简单原理

前言

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

视频播放基本流程






图1、视频播放流程图

  1. 解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据,常用协议:HTTP、RTMP、MMS等;
  2. 解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据,常见视频格式:MP4、MKV、FLV、RMVB等
  3. 解码(视、音频解码):将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据,常见解码:视频编码H264->像素数据YUV/RGB、音频编码AAC->采样数据PCM
  4. 音画同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来,以FFmpeg库为例,利用时间戳去同步二者:PTS(Presentation Time Stamp 显示时间戳)、DTS(Decoding Time Stamp 解码时间戳);
  5. 终端设备播放:显卡、声卡对视(YUV、RGB)音频(PCM)的输出。

基本概念

  1. 分辨率:指每一帧画面的大小,宽乘高等于若干像素。目前主流的高清格式通常为:720p(1280×720)、1080p(1920×1080)、2K(2560x1440)、4K(4096×2160)
  2. 码率(比特率,bit per second / bps / bit rate):指单位时间传输的或解码的位数。码率越大,说明单位时间内取样率越大,数据流精度就越高,这样表现出来的的效果就是:视频画面更清晰画质更高。
  3. 帧率(frames per seconds / fps):指播放时每秒移动多少帧。通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧;视频帧率影响的是画面流畅感,也就是说视频帧率超高,表现出来的效果就是:画面越显得流畅。一般NTSC①是30,PAL②是25,帧速太低则画面不连续播放的流畅性就差,所以要恰到好处才行。
  4. 采样率(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 Google 2013 研发中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微软平台

音频编码

音频编码和视频编码的道理一个样,对原始音频数据的压缩,为的也是节省空间,AAC和MP3应用广泛。


表4、常见音频编码
名称 推出机构 推出时间 目前使用领域
AAC MPEG 1997 各个领域(新)
AC-3 Dolby Inc. 1992 电影
MP3 MPEG 1993 各个领域(旧)
WMA Microsoft Inc. 1999 微软平台

音画同步

音视频是不同设备去采集,音视频编码解码时间不一致,流媒体传输将音视频分开传输等等原因,不作处理,声音和画面播放往往是不同步的,直接播放肯定是没法看的。采集的时候需要给每个视频帧和音频样本加上时间戳,再通过一个基准将音画进行同步处理,解决方案有如下几种:

  1. 将视频同步到音频上,就是以音频的播放速度为基准来同步视频。视频比音频播放慢了,加快其播放速度;快了,则延迟播放。
  2. 将音频同步到视频上,就是以视频的播放速度为基准来同步音频。
  3. 将视频和音频同步外部的时钟上,选择一个外部时钟为基准,视频和音频的播放速度都以该时钟为标准。

后话

经过一段时间的学习,反反复复看雷神的博客,写了些代码实践验证,音视频这个领域广度和深度是我无法想象的,还是要靠慢慢的积累。文中有什么错误和不足欢迎指正。

参考

《视音频编解码技术零基础学习方法》
《FFMPEG编码:参数研究》
《FFmpeg学习6:视音频同步》

上一篇