FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

这篇具有很好参考价值的文章主要介绍了FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    最近在开发中遇到了一个问题,即无法提取到MP4中H264流的关键帧进行处理,且保存到本地的AAC音频也无法正常播放。经过调试分析发现,这是由于解封装MP4得到的H264和AAC是ES流,它们缺失解码时必要的起始码/SPS/PPSadts头

1. MP4格式解析

1.1 MP4简介

 MP4封装格式是基于QuickTime容器格式定义,媒体描述与媒体数据分开,目前被广泛应用于封装h.264视频和aac音频,是高清视频/HDV的代表。MP4文件中所有数据都封装在Box中(d对应QuickTime中的atom),即MP4文件是由若干个Box组成,每个Box有长度和类型,每个Box中还可以包含另外的子Box,因此,这种包含子Box的也可被称为container Box。Box的基本结构如下图所示:

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

 从上图可知,Box的基本结构由两部分组成:BoxHeaderBoxDataBoxHeadersizetypelargesize(由size的值确定是否存在)组成,它们分别占4bytes、4bytes、8bytes,其中,size表示的是整个Box的大小(BoxHeader+BoxData),假如Box的大小超过了uint32的最大值,size会被置为1,这时将由largesize来表示Box的大小。type表示Box的类型,主要有ftyp、moov、mdat等。largesize表示当size=1时,用它代替size来存储Box的大小;BoxData存储的是真实数据(不一定是音视频数据),大小由真实数据决定。

【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNxhttps://docs.qq.com/doc/DYU5ORlBOdkpCUkNx

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC
 

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

1.2 MP4结构分析

 Box是构成MP4文件的基本单元,一个MP4文件由若干个Box组成,且每个Box中还可以包括另外的子Box。MP4格式结构中包括三个最顶层的Box,即ftypmoovmdat,其中,ftyp是整个MP4文件的第一个Box,也是唯一的一个,它主要用于确定当前文件的类型(比如MP4);moov保存了视频的基本信息,比如时间信息、trak信息以及媒体索引等;mdat保存视频和音频数据。需要注意的是,moov Box和mdat Box在文件中出现的顺序不是固定的,但是ftyp Box必须是第一个出现。

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

 当然,我们也可以使用MP4Info软件打开一个MP4文件来观察MP4的结构。从下图可以看到,该软件不仅能够看到MP4文件的Box结构,还列出了音频数据的格式(mp4a)、采样率、通道数量、比特率和视频的格式(AVC1)、宽高、比特率、帧率等信息。需要注意的是,由于录制设备的不同,生成的MP4文件可能会包含类型为free的Box,这类Box通常出现在moov于mdata之间,它的数据通常为全0,其作用相当于占位符,在实时拍摄视频时随着moov类型数据的增多会分配给moov使用,如果没有free预留的空间,则需要不停的向后移动mdat数据以腾出更更多的空间给moov。

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

  • ftype box

 ftyp就是一个由四个字符组成的码字,用来标识编码类型、兼容性或者媒体文件的用途,它存在于MP4文件和MOV文件中,当然也存在于3GP文件中。因此,在MP4文件中,ftyp类型Box被放在文件的最开始,用于标志文件类型为MP4,这类Box在文件中有且只有一个。我们利用WinHex工具打开一个MP4文件,就可以看到ftyp Box的具体细节,如下图所示:

FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC

 根据Box的基本结构可知,Box由BoxHeader和BoxData构成,其中,BoxHeader又由size、type以及largesize(可选)组成。由上图可以知道,ftyp Box头部信息为0x00 00 00 18 66 74 79 70,其中,0x00 00 00 18这四个字节表示ftyp Box整个Box的大小size=24字节;0x66 74 79 70表示该Box为ftyp类型,它们组成了ftyp的头部。0x6D 70 34 32(十六进制)表示major brand,这里为"mp42"且不同的文件该值可能不一样;0x00 00 00 00表示minor version。

  • moov box

 moov类型box主要用于存储媒体的时间信息、trak信息和媒体索引等信息。从MP4Info软件打开的文件可知,moov Box是紧接着ftyp Box的,因此,该Box头部为0x00 00 28 D1 6D 6F 6F 76,其中,0x00 00 28 D1表示整个moov Box的大小size=10449字节,0x6D 6F 6F 76表示当前Box为moov类型,而剩下的字节数据即为BoxData。另外,moov Box还包含了mvhd文章来源地址https://www.toymoban.com/news/detail-414892.html

到了这里,关于FFmpeg从入门到入魔(3):提取MP4中的H.264和AAC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 报错:FFMPEG: tag 0x34363258/‘X264‘ is not supported with codec id 27 and format ‘mp4 / MP4‘

    首先说一下报错的地方,是在使用VideoWriter保存视频时: 出现如下错误: 经过查找网上资料,发现是cv2.VideoWriter_fourcc()参数存在问题, 解决方法: 将 修改为: 即可完美解决问题。

    2024年02月07日
    浏览(65)
  • [解决思路]关于h264裸流合成mp4时时间戳添加问题

            使用GPU编码(Opencv)生成的h264视频片段中不包含时间戳信息,且含有B帧,直接合成mp4后会导致播放出现问题(瞬间播放完成)。因此,在合成时需要手动添加时间戳。         发现生成的视频会 瞬间播放完成 后,意识到是时间戳的问题,检查时间戳代码:        

    2024年01月21日
    浏览(37)
  • ios系统下h264编码的mp4文件无法播放的问题

    问题描述: ios系统下,部分h264编码的mp4文件在浏览器中无法播放,而另外一些h264编码的mp4文件正常,同时在安卓系统下全部正常。 问题分析: H.264中有profile(画质级别)和level(用来约束分辨率、帧率和码率)的概念,profile有四种,分别是Baseline Profile(基本画质)、Ext

    2024年02月11日
    浏览(41)
  • 音视频知识:MPEG-4、H264、MP4、AAC之间的关系

    MPEG-4 一种编码标准。是国际标准化组织 (ISO) 主要针对消费类应用,已经针对运动图像压缩定义的标准。MPEG(Moving Picture Experts Group)标准包括 MPEG1、MPEG2与 MPEG4。 MPEG-4标准目前分为27个部分,统称为ISO/IEC14496国际标准。其中第10部分(ISO/IEC 14496-10)就是熟悉的高级视频编码

    2024年02月14日
    浏览(65)
  • FFMPEG mp4封装实现

    FFMPEG mp4录像 author:lyn date:2022.09.28 version: ffmpeg4.1.3 1.mp4数据结构 2.ffmpeg mp4封装实现 3.mp4函数调用关系 4.参考资料 1.mp4数据结构 1.1mp4简介 MP4或称MPEG-4第14部分(英语:MPEG-4 Part 14)是一种标准的数字多媒体容器格式。MPEG-4第14部分的扩展名为 .mp4 ,以存储数字音频及数字视频

    2023年04月08日
    浏览(33)
  • ffmpeg操作MP4视频封面

    提取视频封面 视频流中提取帧图 3.重新设置视频封面 更多参考: https://blog.csdn.net/m0_37624402/article/details/125123818

    2024年02月04日
    浏览(40)
  • 20231005使用ffmpeg旋转MP4视频

    20231005使用ffmpeg旋转MP4视频 2023/10/5 12:21 百度搜搜:ffmpeg 旋转90度 https://zhuanlan.zhihu.com/p/637790915 【FFmpeg实战】FFMPEG常用命令行 https://blog.csdn.net/weixin_37515325/article/details/127817057 FFMPEG常用命令行 5.视频旋转 顺时针旋转90度:ffmpeg -i test.mp4 -vf \\\"transpose=1\\\" out.mp4//顺时针旋转90° 逆时针

    2024年02月07日
    浏览(46)
  • ffmpeg将rtsp流转成mp4

    中间的rtsp网址一定要加上双引号,避免出现url有特殊字符的问题 如果不支持tcp协议,去掉下面两个参数即可,加上这两个参数是因为ffmpeg默认使用udp协议,会导致丢包 -rtsp_transport、-tcp

    2024年02月11日
    浏览(44)
  • ffmpeg批量转换mpg为mp4

    1、新建一个txt文件,并复制如下代码进入,然后保存。 2、把文件后缀修改为bat 。 3、把后缀为bat的文件放到要批量处理的视频文件夹里面。 4、在确保安装了ffmpeg的情况下,双击bat文件执行即可。 5、参数说明: -i          输入文件,这里指的就是视频文件。 -y       

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包