引言
- 本文章旨在记录本人学习有关音视频时对H264码流视频编解码原理部分的内容,如有不对请留言指出
1、音视频封装格式
我们一般下载或者播放的视频文件常见都是以 xxx.mp4、xxx.flv、xxx.mkv等标识结尾,其实这都是对视频+音频的进一步封装,详见如下视频文件的经典图:
通过上图我们知道一个视频需要播放起来能看,经过的步骤
①解封装格式→ ②视频解码 → ③音视频同步,
H264视频压缩数据就在视频解封装格式后这步。所以单纯的想要播放有画面的视频只需要拿到xxx.h264文件即可。
通过FFmpeg工具即可直接得到一个视频的h264视频压缩文件。
FFmpeg 工具抽取视频的H264文件命令:
(1)mp4视频文件抽取H264视频文件命令:
ffmpeg.exe -i 源视频名.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 输出视频文件名.h264
(2)播放H264文件
ffplay.exe (h264文件名).h264
2、H264介绍
关于H264的由来介绍可参考以下几篇文章,就不过多记录了
1)H264百度百科:https://baike.baidu.com/item/H.264/1022230?fromtitle=H264&fromid=7338504&fr=aladdin
3、H264文件分析
首先我们还是用FFmpeg工具将之前抽取到的视频压缩H264文件进一步抽取出原始视频数据 yuv文件:
(1)H264文件抽取yuv视频文件命令:
ffmpeg.exe -i out.h264 -s 544x960 -pix_fmt yuv420p out.yuv
解释:
out.h264:(h264源文件名)
544x960:(视频分辨率)
yuv420p:(编码格式)
out.yuv: (输出的yuv文件名)
(2)播放yuv文件命令:
ffplay.exe -video_size 544x960 -i out.yuv
解释:
544x960:(视频分辨率)
out.yuv:(yuv文件名)
然后看个文件大小数据对比:
源视频 【2.79MB】←pk→ H264文件【2.65MB】 ←pk→ yuv【454MB】文件
裸数据从454MB直接压缩到2.65MB,直接压缩了差不多200倍,逆天了。真的是极大的节约了存储空间
H264说到底就是对视频数据进行压缩的技术,主要采用了以下几种方法对视频数据进行压缩
- 帧内预测压缩,解决的是空域数据冗余问题
- 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题
- 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化
- CABAC压缩
经过压缩后的帧分为:I帧,P帧、B帧
- I帧:关键帧,采用帧内压缩技术
- P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术
- B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术
除了I/P/B帧外,还有图像序列GOP
GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:
4、H264压缩技术过程
…由于此压缩技术过程篇幅过长,可看此篇记录文章