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

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

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

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

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

所以我们要得到符合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张  | 剑痴乎

最后编辑:
作者:Jeff
Avatar
管理员——代码为剑,如痴如醉

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

  1. Avatar ma11 says:
    TheWorld Browser TheWorld Browser Windows 10 x64 Edition Windows 10 x64 Edition

    你这个查看MP4格式的工具叫什么?

  2. Avatar liyang says:
    Firefox 65.0 Firefox 65.0 Windows 10 x64 Edition Windows 10 x64 Edition

    请教大佬,怎样解析出帧率和码率。

    • Avatar Jeff says:
      Google Chrome 78.0.3904.70 Google Chrome 78.0.3904.70 Windows 10 x64 Edition Windows 10 x64 Edition

      mp4 stts box解析得到总sample(帧数)个数,除以解析头部mvhd box得到的总时长就是帧率了。
      解析btrt box(嵌套在stsd box里面)可得到最大码率以及平均码率。

留下一个回复

你的email不会被公开。

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