【读书会第13期】第二章视频文件的封装格式和编码格式笔记
FFmpeg的视频封装格式
FFmpeg支持很多封装格式,包括MP4、FLV、MKV、TS 等视频封装格式、MP3、AAC等音频封装格式以及RTMP、RTSP、HLS 等网络协议封装格式。
# ./configure --list-muxers
a64 framehash mpeg1vcd rm
ac3 framemd5 mpeg1video roq
adts g722 mpeg2dvd rso
adx g723_1 mpeg2svcd rtp
aiff g726 mpeg2video rtp_mpegts
amr g726le mpeg2vob rtsp
apng gif mpegts sap
aptx gsm mpjpeg sbc
aptx_hd gxf mxf scc
asf h261 mxf_d10 segafilm
asf_stream h263 mxf_opatom segment
ass h264 null singlejpeg
ast hash nut smjpeg
au hds oga smoothstreaming
avi hevc ogg sox
avm2 hls ogv spdif
avs2 ico oma spx
bit ilbc opus srt
caf image2 pcm_alaw stream_segment
cavsvideo image2pipe pcm_f32be sup
chromaprint ipod pcm_f32le swf
codec2 ircam pcm_f64be tee
codec2raw ismv pcm_f64le tg2
crc ivf pcm_mulaw tgp
dash jacosub pcm_s16be truehd
data latm pcm_s16le tta
daud lrc pcm_s24be uncodedframecrc
dirac m4v pcm_s24le vc1
dnxhd matroska pcm_s32be vc1t
dts matroska_audio pcm_s32le voc
dv md5 pcm_s8 w64
eac3 microdvd pcm_u16be wav
f4v mjpeg pcm_u16le webm
ffmetadata mkvtimestamp_v2 pcm_u24be webm_chunk
fifo mlp pcm_u24le webm_dash_manifest
fifo_test mmf pcm_u32be webp
filmstrip mov pcm_u32le webvtt
fits mp2 pcm_u8 wtv
flac mp3 pcm_vidc wv
flv mp4 psp yuv4mpegpipe
framecrc mpeg1system rawvideo
MP4封装格式
MP4 封装格式基本上可以认为是日常生活和工作中最常见的视频文件格式,主要是由于其广泛的适用性,不仅在PC端(windows、mac、linux)支持的非常好,而且在移动端(Android、iOS)也能流畅播放。
MP4 格式标准
MP4 格式标准为ISO-14496 Part 12和ISO-14496 Part 14,具体特征如下:
- MP4 文件由许多Box和FullBox。
- FullBox是 Box 的扩展,在 Header中增加了8位version信息和24位的flags信息。3.每个Box 由Header 和 Data两部分组成。
- Header中包含了整个Box的长度大小(size)和类型(type)。
- Data中包含了实际的数据,可以是纯数据,也可以是子Box。当Box 中的 Data是一系列子Box时,这个Box又被称为Container(容器)。
MP4 ftyp Box
ftyp Box,一般位于文件开始位置,其中包含了MP4视频文件的类型、版本、兼容协议等信息。
MP4 moov容器
moov容器中包含了MP4视频文件的媒体数据信息,内部又包含两个子容器: mvhd和trak,前者定义了文件头信息,后者定义了媒体文件中的track信息。
moov容器一般默认会生成在MP4文件结尾,在线播放时需要加载完整个文件才能正常打开,为了能够快速打开视频,需要把moov容器放在MP4文件的前面。
MP4 mdat Box
mdat Box,用来存放媒体文件的实际数据内容。
FFmpeg的视频编码格式
FFmpeg 支持很多视频编码格式,比如MPEG4、H263、H264、H265、VP8、VP9等。接下来,重点介绍H264 视频编码格式。
H264的码率控制
- VBR: Variable BitRate,动态码率模式,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高。
- CBR: Constant BitRate,恒定码率模式,由于码率恒定,有画面剧烈变化时,QP参数会增大,图像质量会变差,当场景静止时,又浪费带宽。该模式的整体图像质量不稳定。
- ABR: Average BitRate,平均码率模式,是VBR的一种衍生形式,在指定的文件大小内,静态或者接近静态的画面部分使用相对较低的流量,复杂画面部分使用较高的流量,可以视为是 VBR和CBR的一种折衷方案。
H264的I帧类型
帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留;
- 一个GOP序列的第一个图像叫做IDR图像(立即刷新图像),IDR图像都是Ⅰ帧图像,但I帧不一定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。
2.I帧,又叫帧内参考帧,保留一帧完整的画面。
3.解码时仅用I帧的数据就可重构出完整的图像。
4.I帧不需要参考其他画面而生成。
5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)。 - I帧不需要考虑运动矢量。
7.I帧所占数据的信息量最大。
H264的B帧类型
双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别
1.B帧,又叫双向参考帧,也就是B帧记录的是本帧与前后帧的差别,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。
2.B帧的压缩率最高,但是解码时CPU使用率会比较高。
3.B帧是由前面的I或P帧和后面的P帧来进行预测的。
4. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量。5.B帧不是参考帧,不会造成解码错误的扩散。
H264的P帧类型
前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要之前缓存的画面叠加上本帧定义的差别,生成最终画面。
1.P帧,又叫前向参考帧,表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,Р帧没有完整画面数据,只有与前一帧的画面差异的数据。
2.P帧是I帧后面相隔1~2帧的编码帧。
3.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
6. P帧是参考帧,可能会造成解码错误的扩散。
7. P帧的压缩比介于I帧和B帧之间。
- 点赞
- 收藏
- 关注作者
评论(0)