I、P、B帧区别
I frame :
帧内编码帧 又称 intra picture ,I 帧通常是每个 GOP( MPEG 所使用的一种视频压缩技术)的第一个帧,
经过适度地压缩, 做为随机访问的参考点, 可以当成图象。 I 帧可以看成是一个图像经过压缩后的产物
I 帧特点 :
1.I 帧是一个全帧压缩编码帧。它将全帧图像信息进行 JPEG 压缩编码及传输 ;
2.I 帧解码时仅用 I 帧的数据就可重构完整图像 ;
3.I 帧描述了图像背景和运动主体的详情 ;
4.I 帧不需要参考其他画面而生成 ;
5.I 帧是 P 帧和 B 帧的参考帧 (其质量直接影响到同组中以后各帧的质量 );
6.I 帧是帧组 GOP 的基础帧 (第一帧 ),在一组中只有一个 I 帧 ;
7.I 帧不需要考虑运动矢量 ;
8.I 帧所占数据的信息量比较大。
P frame:
前向预测编码帧 又称 predictive-frame ,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
P 帧是以 I 帧为参考帧 ,在 I 帧中找出 P 帧“某点 ”的预测值和运动矢量 , 取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中
找出 P 帧“某点 ”的预测,值并与差值相加以得到 P 帧“某点 ”样值 ,从而可得到完整的 P 帧。
P 帧特点 :
1.P 帧是 I 帧后面相隔 1~2 帧的编码帧 ;
2.P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量 (预测误差 );
3.解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像 ;
4.P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或 P 帧;
5.P 帧可以是其后面 P 帧的参考帧 ,也可以是其前后的 B 帧的参考帧 ;
6.由于 P 帧是参考帧 ,它可能造成解码错误的扩散 ;
7.由于是差值传送 ,P 帧的压缩比较高。
B frame:
双向预测内插编码帧 又称 bi-directional interpolated prediction frame ,既考虑与源图像序列前面已编码帧,
也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧
B 帧 以前面的 I 或 P 帧和后面的 P 帧为参考帧 , “找出 ”B帧“某点 ”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在
两个参考帧中 “找出 (算出 ) ”预测值并与差值求和 ,得到 B 帧“某点 ”样值 ,从而可得到完整的 B 帧。
B 帧特点
1.B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的 ;
2.B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量 ;
3.B 帧是双向预测编码帧 ;
4.B 帧压缩比最高 ,因为它只反映丙参考帧间运动主体的变化情况 ,预测比较准确 ;
5.B 帧不是参考帧 ,不会造成解码错误的扩散
注:I 、B、P 各帧是根据压缩算法的需要 ,是人为定义的 ,它们都是实实在在的物理帧 ,至于图像中的哪一帧是 I 帧,是随机的 ,一但确定了 I 帧,以后的各帧就严格按规定顺序排列。
如果一个GOP钟没有B帧,解码器可以线性解码。
如果GOP中I\P\B帧间隔进行,那么解码器需要结合前后帧画面去预解读。切B帧不能随便丢,如果丢掉会造成画面卡顿即丢帧,因为B帧也包含了画面信息的。
一般平均I帧的压缩率是7相当于一个JPG图片的压缩率,P帧是20,B帧是50,相对来说B帧更节约空间。,B帧多了,就可以将节省下的空间保存I帧。
GOP组:
画面组 Group of Picture
一个 GOP 就是一组连续的画面,gop一般设置为帧率的2倍,关键帧间隔越长,也就是 GOP 越长,理论上画面越高清。GOP说白了就是两个I帧之间的间隔。
GOP=frameRate*2
MPEG-2 压缩
该算法压缩的帧结构有两个参数:
一个参数是 GOP( Group Of Picture )图像组的长度,一般可按编码方式从 1-15;
另一个是 I 帧和 P 帧之间 B 帧的数量, 一般是 1-2 个。前者在理论上记录为 N,即多少帧里面出现一次 I 帧;后者描述为多少帧里出现一次 P 帧,记录为 M
MPEG4
mpeg4 的每一帧开头是固定的: 00 00 01 b6,
各类型帧与 2bit 的对应关系
00: I Frame
01: P Frame
10: B Frame
举例说明:
举几个例子,以下是 16 进制显示的视频编码:
00 00 01 b6 10 34 78 97 09 87 06 57 87 …… I 帧
00 00 01 b6 50 78 34 20 cc 66 b3 89 …… P 帧
00 00 01 b6 96 88 99 06 54 34 78 90 98 …… B 帧
下面我们来分析一下为什么他们分别是 I、P、B 帧
0x10 = 0001 0000
0x50 = 0101 0000
0x96 = 1001 0100
大家看红色的 2bit ,再对照开头说的帧与 2bit 的对应关系,bingo,符合
switch (buf[i] & ( BYTE)0xc0)
{
case 0x00:
//I Frame
break ;
case 0x40:
//P Frame
break ;
case 0x80:
//B Frame
break ;
default :
break ;
}
PTS:
Presentation Time Stamp。PTS 主要用于度量解码后的视频帧什么时候被显示出来
DTS:
Decode Time Stamp。DTS 主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码,在没有 B 帧存在的情况下 DTS 的顺序和 PTS 的顺序应该是一样的.
码率:
一般用多少 kbps(千比特 /秒)或者 mbps (兆比特 /秒)来表示
帧率:
(FPS, 帧 /秒), 就是视频画面刷新的速度,
yuv:
主要指亮度和两个色差信号
YUV 文件格式又分很多种,有存储和压缩格式。
视频压缩用到的是 YUV420 格式,这是 因为人眼对亮度更敏感些,对色度相对要差些
附:FFMPEGLinux安装
ffmpeg Linux安装:
1.安装SDL:
sudo apt-get install libsdl1.2-dev
sudo apt-get install libsdl-image1.2-dev
sudo apt-get install libsdl-mixer1.2-dev
sudo apt-get install libsdl-ttf2.0-dev
sudo apt-get install libsdl-gfx1.2-dev
2.安装x264:
git clone https://github.com/qupai/x264.git
./configure --prefix=/usr --enable-shared --disable-cli &&
sudo make
sudo make install
3.安装FFMPEG:(该方法未生成ffplay)
更新库:(libMP3lame-dev、libxvidcore4-dev未找到,删掉即可)
sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libMP3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxvidcore4-dev zlib1g-dev
./configure --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/ffmpeg/include --extra-ldflags=-L/usr/local/ffmpeg/lib --enable-ffplay
sudo make
sudo make install
4.配置环境变量:
sudo vi /etc/ld.so.conf
----添加 /usr/local/ffmpeg/lib
sudo ldconfig
sudo vi ~/.bashrc
----添加 export PATH="/usr/local/ffmpeg/bin:$PATH"
source ~/.bashrc
问题:ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open (未配置上述环境变量导致)
sudo vi /etc/ld.so.conf
----添加 /usr/local/ffmpeg/lib
sudo ldconfig
sudo vi ~/.bashrc
----添加 export PATH="/usr/local/ffmpeg/bin:$PATH"
source ~/.bashrc
参考:FFMPEG基础库编程开发