剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 音视频
  3. 正文

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

2016年3月15日 431点热度 0人点赞 4条评论

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

解析后的视频数据不做处理,写到文件可以直接播放的mp4文件视频编码格式为MPEG4,每一帧头部是0x00 0x00 0x01分隔符。
mp4 parse

而编码格式为H264的sample数据区别于一般的NALU,此时mdat box中sample格式定义为:4字节sample长度+数据,也就是startcode是4字节长度,不是0x00 0x00 0x00 0x01。
mp4 parse

所以我们要得到符合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。
mp4v parse

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: 音视频
最后更新:2018年12月23日

Jeff Young

代码为剑,如痴如醉

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • ma11

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

    2019年3月9日
    回复
    • Jeff

      @ma11 Mp4Reader:https://pan.baidu.com/s/1cBC_yRR-BUfMGpUnC2LN8g

      2019年3月9日
      回复
  • liyang

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

    2019年11月26日
    回复
    • Jeff

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

      2019年11月26日
      回复
  • 取消回复

    我的其它小窝

    公众号:码上Play(基本不更新,回答问题用)

    近期评论
    • Jeff on WebRTC研究:BBR拥塞控制被移除了研究过了,等后面有时间简单说明下
    • xhcx on WebRTC研究:BBR拥塞控制被移除了楼主,BBR移除的原因最近有研究吗,分享一下
    • Jeff on Windows平台WebRTC编译(持续更新)M79是2019年发布的版本,不适用这篇文章。编译…
    • haige on Windows平台WebRTC编译(持续更新)我编译的m79版本,用VS2019打开会报错, F…
    • 菜菜 on libcef编译使用--使用VS2015是真的鸟
    版权声明

    为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

    相关文章推荐
    • 音视频开发入门:视频基础
    • 大话WebRTC
    • WebRTC研究:Transport-cc之RTP及RTCP
    • WebRTC音视频传输基础:NAT穿透
    • Intel平台硬件加速视频编解码开发

    COPYRIGHT © 2021 剑痴乎. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS