首页 > 音视频技术 > MP4解析得到的视频播放问题
2016
03-15

MP4解析得到的视频播放问题

前段时间完成了AVI的文件解析程序,也封装了接口。这段时间一直在写MP4文件的解析程序(都没用到第三方库),已经写得差不多了,可以还原音视频帧列表,得到封装的音视数据。不过在测试播放解析得到的视频却发现了一个问题,部分MP4文件解析得到的视频可以用ffplay播放,部分不行。后来仔细对比了下视频文件内容,发现是视频编码类型导致的。

解析后的视频数据不做处理,写到文件可以直接播放的mp4文件视频编码格式为MPEG4,每一帧头部是0x00 0x00 0x01分隔符。
MP4解析得到的视频播放问题 - 第1张  | Jianchihu

而编码格式为H264的sample数据区别于一般的NALU,此时mdat box中sample格式定义为:4字节sample长度+数据,也就是startcode是4字节长度,不是0x00 0x00 0x00 0x01。
MP4解析得到的视频播放问题 - 第2张  | Jianchihu

所以我们要得到符合H264标准的数据,需要将sample头部4字节长度替换为0x00 0x00 0x00 0x01分隔符,这样就得到了一个完整的nalu。

SPS、PPS、I帧(包含一个或多个 I-Slice)、P帧(包含一个或多个P-Slice)、B帧(包含一个或多个 B-Slice)构成典型的 H.264 码流结构。要想让解码器解码,我们还必需sps与pps这两个参数集。sps与pps数据从stsd box得知,如下图。然后我们在获取的sps与pps数据头部加上0x00 0x00 0x00 0x01构成一个完整的nalu,这样就得到了sps或pps类型的nalu。
MP4解析得到的视频播放问题 - 第3张  | Jianchihu

最后编辑:
作者:Jianchihu
管理员——低调做事,低调做人

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.