前言
其实我以后并不打算着重研究视频编码,只是因为这次毕设选了这个题,所以稍微学了点相关的皮毛。关于FFMPEG的源码的分析我推荐雷宵骅前辈写的博客,需要学习的请点击传送门。我基本是看着他的博客学的,虽然现在ffmpeg版本有一定更新,但是大体框架基本是不变的,题目中需要用到的并且和他的博客中写的不同的我会稍微提一下。关于其他ffmpeg源码的研究如果没有特殊需要,我基本是不会考虑做的。最后,如果我有写错,欢迎指正。
正文
关于实现隐写算法我打算分两篇来写,这篇写铺垫一下理论知识,下一篇从代码实现角度上讲
1. 关于H.264编码的相关知识
关于H.264是什么东西这种问题这里就不多赘述了。我们直接讲一点干货。
1.1 I帧 P帧 B帧 与 GOP
任何一个视频,都可以看做是一个图片流,对于视频中每一张图片,我们一般称作帧。H.264格式视频流中的帧一般分为3类,即I帧,P帧,B帧(好像还有其他类别的帧,可以用于处理非常特殊的图片,这里不展开讲了)。这三类帧分别用不同的策略来压缩一张图片,从而降低视频大小。
从信息论的角度来讲,数据可以压缩是因为信息存在冗余,信息冗余存在的条件要么是出现频率不均等,要么是数据间存在相关性。对于出现频率不均等的数据我们可以运用熵编码(如哈夫曼编码)的手段将数据压缩;对于数据间存在相关性这个问题只能根据具体问题,试图将相关的数据转化成出现概率不均等的的数据。所以视频编码的核心就是挖掘视频画面中所有像素点之间的相关性。当然在必要时,也可以制造一些肉眼不可见的相关性进一步压缩。(比如直接砍去画面中高频分量)
理解了这点之后就比较容易理解这三种帧了:I帧主要挖掘单个画面中的像素点的相关性,P帧挖掘当前画面与前一个画面之间的相关性,B帧挖掘当前画面与前后两个画面之间的相关性。乍一眼看下去好像B帧比P帧厉害