前段时间完成了AVI的文件解析程序,也封装了接口。这段时间一直在写MP4文件的解析程序(都没用到第三方库),已经写得差不多了,可以还原音视频帧列表,得到封装的音视数据。不过在测试播放解析得到的视频却发现了一个问题,部分MP4文件解析得到的视频可以用ffplay播放,部分不行。后来仔细对比了下视频文件内容,发现是视频编码类型导致的。
解析后的视频数据不做处理,写到文件可以直接播放的mp4文件视频编码格式为MPEG4,每一帧头部是0x00 0x00 0x01分隔符。
而编码格式为H264的sample数据区别于一般的NALU,此时mdat box中sample格式定义为:4字节sample长度+数据,也就是startcode是4字节长度,不是0x00 0x00 0x00 0x01。
所以我们要得到符合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格式的工具叫什么?
@ma11 Mp4Reader:https://pan.baidu.com/s/1cBC_yRR-BUfMGpUnC2LN8g
请教大佬,怎样解析出帧率和码率。
@liyang mp4 stts box解析得到总sample(帧数)个数,除以解析头部mvhd box得到的总时长就是帧率了。
解析btrt box(嵌套在stsd box里面)可得到最大码率以及平均码率。