使用mp4v2封装h264裸流
前言
最近项目需要将视频数据压缩并封装成mp4,研究了ffmpeg的方式,但是最终也没搞定。后面换成x264+mp4v2的方式,网上也有一些例子,但是发现都是对x264编出来裸流进行过处理,下下来无法封装成功,自己研究了几天,最终搞定。
X264是用于将原始视频压缩成h264格式的开源库,mp4v2 库是一个专用于处理mp4容器的开源项目,其使用c++编写,并提供C语言接口。
我在项目中是用x264将yuv原始视频压缩成不带B帧的h264裸流,没有加时间戳,也没有加其他任何处理,以下封装步骤也是针对此种情况进行。
H264格式讲解
我在用mp4v2封装的过程,很大程度上还是对h264的格式不够熟悉,造成了封装过程中出现这样那样的问题,因此在这里着重解释一下封装过程中需要知道的一些知识。
SPS(序列参数集)和PPS(图像参数集),两者都是包含解码必须的一些信息。网上有资料说h264的第一帧数据就是SPS,第二帧数据就是PPS,这是不正确的。正确的说法应该是每一个IDR帧之前,都会有一个SPS和PPS,而且在x264编码的过程中,PPS和SPS是一起输出的。
例如下面所示的视频序列,每一个IDR帧前都有一个SPS和PPS。
SPS PPS IDR P P P … P P SPS PPS IDR P P P …
MP4V2封装h264裸流步骤
图1 mp4v2封装h264裸流