三、视频编码原理
1、视频为何需要压缩?
原因:未经压缩的数字视频的数据量巨大
2、主要压缩了什么东西?
原始视频压缩的目的是去除冗余信息,可以去除的冗余包括:
空间冗余:图像相邻像素之间有较强的相关性
时间冗余:视频序列的相邻图像之间内容相似
编码冗余:不同像素值出现的概率不同
视觉冗余:人的视觉系统对某些细节不敏感
知识冗余:规律性的结构可由先验知识和背景知识得到
3、数据压缩是怎么分类的?
①、无损压缩(Lossless)
压缩前、解压缩后图像完全一致 X=X’
压缩比低(2:1~3:1)
典型格式例如:Winzip,JPEG-LS。
②、有损压缩(Lossy)
压缩前解压缩后图像不一致 X≠X’
压缩比高(10:1~20:1)
利用人的视觉系统的特性
典型格式例如:MPEG-2,H.264/AVC, AVS。
4、视频编码
①、定义
定义:通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式。
视频数据在时域和空域层面都有极强的相关性,这也表示有大量的时域冗余信息和空域冗余信息,压缩技术就是去掉数据中的冗余信息。
<1>、去除时域冗余信息
运动补偿:通过先前的局部图像来预测、补偿当前的局部图像,可有效减少帧序列冗余信息。
运动表示:不同区域的图像使用不同的运动矢量来描述运动信息,运动矢量通过熵编码进行压缩( 熵编码在编码过程中不会丢失信息)。
运动估计:从视频序列中抽取运动信息。通用的压缩标准使用基于块的运动估计和运动补偿。
<2>、去除空域冗余信息
变换编码:将空域信号变换到另一正交矢量空间,使相关性下降,数据冗余度减小。
量化编码:对变换编码产生的变换系数进行量化,控制编码器的输出位率。
熵编码:对变换、量化后得到的系数和运动信息,进行进一步的无损压缩。
②、编解码器
编码器(Encoder):压缩信号的设备或程序;
解码器(Decoder):解压缩信号的设备或程序;
编解码器(Codec):编解码器对。
<1>、编码器中的关键技术
预测
变换
量化
熵编码
<2>、编码器中的关键流程
5、视频压缩编码技术
视频压缩编码技术可分为两大类:无损压缩和有损压缩。
①、无损压缩
无损压缩也称为可逆编码,重构后的数据与原数据完全相同,适用于磁盘文件的压缩等。主要采用熵编码方式,包括香农编码、 哈夫曼编码和算术编码等。
香农编码
香农编码采用信源符号的累计概率分布函数来分配码字,效率不高,实用性不大,但对其他编码方法有很好的理论指导意义。
哈夫曼编码
哈夫曼编码完全依据出现概率来构造异字头的平均长度最短的码字。
基本方法为:先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。
编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。
算术编码
算术编码是用符号的概率和编码间隔两个基本参数来描述的,在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。
使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码,估计越准,编码结果就越接近最优的结果。
②、有损压缩
有损压缩也称为不可逆编码,重构后的数据与原数据有差异,适用于任何允许有失真的场景,例如视频会议、可视电话、视频广播、视频监控等。
编码方式包括预测编码、变换编码、量化编码、混合编码等。
6、H.264 编码介绍
①、IPB 帧
I 帧:帧内编码帧(intra picture),采用帧内压缩去掉空间冗余信息。
是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是 I 帧。
P 帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余信息来压缩传输数据量的编码图像。 参考前面的 I 帧或者 P 帧。
“帧间预测编码帧”,需要参考前面的 I 帧和/或 P 帧的不同部分,才能进行编码。P 帧对前面的 P 和 I 参考帧有依赖性。但是,P 帧压缩率比较高,占用的空间较小。
B 帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的冗余信息,来压缩传输数据量的编码图像,也称为双向编码帧。参考前面一个的 I 帧或者 P 帧及其后面的一个 P 帧。
“双向预测编码帧”,以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到 200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。
②、PTS 和 DTS
DTS(Decoding Time Stamp)是标识读入内存中 bit 流在什么时候开始送入解码器中进行解码。也就是解码顺序的时间戳。
PTS(Presentation Time Stamp)用于度量解码后的视频帧什么时候被显示出来。在没有B 帧的情况下,DTS 和 PTS 的输出顺序是一样的,一旦存在 B 帧,PTS 和 DTS 则会不同。也就是显示顺序的时间戳。
③、GOP
即 Group of picture(图像组),指两个 I 帧之间的距离,Reference(参考周期)指两个 P 帧之间的距离。
一个 I 帧所占用的字节数大于一个 P 帧,一个 P 帧所占用的字节数大于一个 B 帧。所以在码率不变的前提下,GOP 值越大, P、B 帧的数量会越多,平均每个 I、P、B 帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量。
简而言之:
字节大小: I > P > B
解码顺序: I -> P -> B
GOP 解码案例:
四、视频播放原理
1、视频播放器简介
视频播放器播放一个互联网上的视频文件(本地文件),需要经过以下几个步骤:
解协议
解封装
解码视音频
视音频同步
①、解协议
将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。
这些协议在传输视音频数据的同时,也会传输一些信令数据。
这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。 解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。
②、解封装
将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4,MKV, RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。
③、解码
将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等。
解码是整个系统中最重要也是最复杂的一个环节。
通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
2、FFmpeg 播放原理
①、ffmpeg 架构
②、ffmpeg 解码流程
注册所有容器格式和 CODEC:av_register_all()
打开文件:av_open_input_file()
从文件中提取流信息:av_find_stream_info()
穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO
查找对应的解码器:avcodec_find_decoder()
打开编解码器:avcodec_open()
为解码帧分配内存:avcodec_alloc_frame()
不停地从码流中提取出帧数据:av_read_frame()
判断帧的类型,对于视频帧调用:avcodec_decode_video()
解码完后,释放解码器:avcodec_close()
关闭输入文件:av_close_input_file()
3、VLC 视频播放原理
几乎所有的视频播放器,如 VLC、MPlayer、Xine,包括 DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解 VLC 的源码会有事半功倍的效果。
大致的来说, 播放一个视频分为 4 个步骤:
acess 访问,或者理解为接收、获取、得到
demux 解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕)
decode 解码,包括音频和视频的解码
output 输出,也分为音频和视频的输出(aout 和 vout)
①、acess 访问
拿播放一个 UDP 组播的 MPEG TS 流来说吧,access 部分负责从网络接收组播流,放到 VLC 的内存缓冲区中,access 模块关注 IP 协议,如是否 IPv6、组播地址、组播协议、端口等信息;如果检测出来是 RTP 协议(RTP 协议在 UDP 头部简单得加上了固定 12 个字节的信息),还要分析 RTP 头部信息。这部分可以参看 VLC 源码 /modules/access/udp.c 。在同目录下还可以看到大量的 access 模块,如 file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等
②、demux 解复用
而 demux 部分首先要解析 TS 流的信息。TS 格式是 MPEG2 协议的一部分,概括地说,TS 通常是固定 188 字节的一个 packet,一个 TS 流可以包含多个 program(节目),一个program 又可以包含多个视频、音频、和文字信息的 ES 流;每个 ES 流会有不同的 PID 标示。而又为了可以分析这些 ES 流,TS 有一些固定的 PID 用来间隔发送 program 和 es 流信息的表格: PAT 和 PMT 表。 关于 TS 格式的详细信息可以去 google 一下。
VLC 专门做了一个独立的库 libdvbpsi 来解析和编码 TS 流,而调用它的代码可以参见 VLC 源码 /modules/demux/ts.c。
其实之所以需要 demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式也就有了 demux。
demux 分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行某种压缩。这就是我们熟知的音视频编码格式,包括 MPEG1(VCD)、MPEG2(DVD)、 MPEG4、H.264、rmvb 等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。VLC 解码 MPEG2 使用了一个独立的库 libmpeg2,调用它的源文件是 /modules/codec/libmpeg2.c。VLC 关于编解码的模块都放在 /modules/codec 目录下, 其中包括著名的庞大的 ffmpeg。
③、解码器
解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到, 还需要一个视频输出的模块。当然可以像一个 Win32 窗口程序那样直接把图像画到窗口 DC 上——VLC 的一个输出模块 WinGDI 就是这么干的,但是通常这太慢了,而且消耗大量的 CPU。在 Windows 下比较好的办法是用 DirectX 的接口,会自动调用显卡的加速功能。
五、视频转码原理
1、视频转码
视频转码是指将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。
转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准, 也可能不遵循相同的视频编码标准。
2、视频转码技术
视频转码技术使用的目的不同,其实现的手段也各不相同。大致上可以分为两类:
①、不同编码格式之间的视频数据转码
不同编码格式之间的数据转码,指通过转码方法改变视频数据的编码格式。通常这种数据转码会改变视频数据的现有码流和分辨率。
例如我们可以将基于 MPEG-2 格式的视频数据转换为 DV 、MPEG-4 或其它编码格式,同时根据其转码目的,指定转码产生视频数据的码流和分辨率。
这种转码方式设计的算法较为复杂,其实质上是一个重新编码的过程,涉及的算法复杂度和系统开销,是由转码所需图像质量要求及转码前后两种编码方式的相关度所决定的。
②、相同编码格式之间的视频数据转码
相同编码格式的数据转码,指不改变压缩格式,只通过转码手段改变其码流或头文件信息。
根据其使用目的, 可分为改变码流和不改变码流两种。
如我们可以将 MPEG-2 全 I 帧 50Mbps 码流的视频数据转码为 MPEG-2 IBBP 帧 8Mbps 码流的视频数据,直接用于播出服务器用于播出。
3、非线性编辑
非线性编辑是借助计算机来进行数字化制作,几乎所有的工作都在计算机里完成,不再需要那么多的外部设备,对素材的调用也是瞬间实现,不用反反复复在磁带上寻找,突破单一的时间顺序编辑限制,可以按各种顺序排列,具有快捷简便、随机的特性。
非线性编辑只要上传一次就可以多次的编辑,信号质量始终不会变低,所以节省了设备、人力,提高了效率。
传统线性视频编辑是按照信息记录顺序,从磁带中重放视频数据来进行编辑,需要较多的外部设备,如放像机、录像机、特技发生器、字幕机,工作流程十分复杂。
非线性编辑系统是指把输入的各种视音频信号进行 A/D(模/数)转换,采用数字压缩技术将其存入计算机硬盘中。
非线性编辑没有采用磁带,而是使用硬盘作为存储介质,记录数字化的视音频信号,由于硬盘可以满足在 1/25s(PAL) 内完成任意一副画面的随机读取和存储,因此可以实现视音频编辑的非线性。
我的qq:2442391036,欢迎交流!