什么是关键帧 有什么用( 二 )


希望采纳
关键帧是什么意思?要如何运用?
关键帧就是独立桢,不以其他桢影象做参考,在mepg标准中影象桢的参考关系如下
影象型别及其相互关系(参考关系如图的箭头所示)
MPEG将影象分成四种类型:I、P、B、D
I影象是帧内编码影象,它不参考其他任何影象而独立编码
P影象是前向预测编码影象,相对于前一参考影象进行有运动补偿的预测编码
B影象是双向预测编码影象,需要前向和后向的参考影象作运动补偿
D影象的目的是提供一种简单的,但质量相当有限的快进播放方式
如何强制ffmpeg编码时输出一个关键帧
如何强制ffmpeg编码时输出一个关键帧
AVCodecContext *c 编码器环境控制代码AVFrame* f 需要编码的一帧视讯 在编码前设定
f->pict_type=FF_I_TYPEf->key_frame=1然后编码
*outsize = avcodec_encode_video(c, temp, outbuf_size, f)则编码之后通过如下引数判断是否为关键帧:
key_frame=c->coded_frame->key_framepict_type=c->coded_frame->pict_type
视讯编码关键帧间隔
压缩比,间隔越大,可以压得越小,用恒定质量模式下不会影响质量但减小位元速率(不费时) 。
大小I>P>B,I帧越稀疏,越能压 。
但是播放搜寻时必须从I帧开始一直解码到所需时间点,所以间隔大了,跳转会很久 。
我的设定一般是Min=6,Max=360,比较宽
如何强制ffmpeg编码时输出一个关键帧
如何强制ffmpeg编码时输出一个关键帧
AVCodecContext *c 编码器环境控制代码AVFrame* f 需要编码的一帧视讯 在编码前设定
f->pict_type=FF_I_TYPE
f->key_frame=1
然后编码
*outsize = avcodec_encode_video(c, temp, outbuf_size, f)
则编码之后通过如下引数判断是否为关键帧:
key_frame=c->coded_frame->key_frame
pict_type=c->coded_frame->pict_type
帧速率与关键帧有什么区别嘛我有一个视讯,格式要求帧
这肯定有,,,
格式是视讯的编码型别 。。帧率是视讯每秒播放多少幅影象 。。
30fps的我好想没听说过,严格的说应该是29.97fps,这是美国NTSC制式电视的帧率
视讯编码中的ibp帧的关系
视讯压缩中,每帧代表一幅静止的影象 。而在实际压缩时,会采取各种演算法减少资料的容量,其中IPB就是最常见的 。
简单地说,I帧是关键帧,属于帧内压缩 。就是和AVI的压缩是一样的 。P是向前搜寻的意思 。B是双向搜寻 。他们都是基于I帧来压缩资料 。
I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧资料就可以完成(因为包含完整画面)
P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前快取的画面叠加上本帧定义的差别,生成最终画面 。(也就是差别帧,P帧没有完整画面资料,只有与前一帧的画面差别的资料)
B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的快取画面,还要解码之后的画面,通过前后画面的与本帧资料的叠加取得最终的画面 。B帧压缩率高,但是解码时CPU会比较累~ 。
从上面的解释看,我们知道I和P的解码演算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面快取一下,遇到P时就使用之前快取的画面就好了,如果视讯流只有I和P,解码器可以不管后面的资料,边读边解码,线性前进,大家很舒服 。
但网路上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,档案小了,解码器就麻烦了,因为在解码时,不仅要用之前快取的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面资讯,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网路上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支援B帧的播放器就造成更大的困扰,画面也就越卡 。
一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来储存多一些I帧,这样在相同位元速率下,可以提供更好的画质 。

推荐阅读