解析 MP4 文件读取信息

在之前文章中已经介绍过了 MP4 标准的来源以及它的格式定义,基本上就是由一个个 Box 组成的,大致的结构如下:

ftyp
moov
    mvhd
    trak
        tkhd
        mdia
    trak
        tkhd
        mdia
mdat

之前文章:

重学音视频?认识 MP4 视频(上)

重学音视频?认识 MP4 视频(下)

接下来我们就要去手动解析 MP4 文件,注意这可不是用 FFmpeg 来解封装,而是从 MP4 文件中一个一个字节读取信息并解析它的含义获得想要的内容。

平常一看到后缀是 .mp4 的文件,脑海里一想到的就是视频,但其实不管后缀如何,它也还是一个二进制文件,可以按照二进制的方式进行读取和写入。

解析 MP4 文件获取信息

举个例子,在 Mac 上用 010 Editor 软件去查看一个 MP4 文件,以 16 进制显示,效果如下:

54ba153087707acc3b3d7019fe8fab9a.png

从图中箭头指示处可以看到 ftypmvhd 两个 Box 类型,另外也还有 moovtkhd 这些 Box 类型。

之所以能够显示出 Box 类型的字符串,是因为把十六进制数据转换成 ASCII 码了,比如 61 对应就是字母 a ,这应该在计算机基础书中都有讲过的。

mvhd Box中存储着视频文件的时长信息,想要获取到这个信息,直接从 Box 中读取就好,至于为什么会这样,见下图:

d6f39f9c3901661d06dff1d93b7330b1.png

上图展示了 mvhd Box 的数据结构,它继承自 FullBox,在读取时先读取 FullBox 的字段,然后在读取 mvhd Box 自己的(取 version == 0 时的数据结构排布)。

479ad913b03c2d9e86506f215e816f33.png

关于 mvhd box 和 full box 的数据结构文档以及 MP4 中所有 Box 的类型资料,已经在知识星球中给出了,可以加入星球在资料中找到,文末有优惠券。

FullBox 的数据结构如上所示,由字节位数可以算出,在 box type 之后偏移 12 字节可以得到 timescale 字段内容,偏移 16 字节可以得到 duration 字段内容。

其中 timescale 为 0x000003E8,对应十进制数据 1000 。

duration 为 0x000086E6,对应十进制数据 34534。

用 duration 除以 timescale 就是视频的时长了,十六进制相除后的结果是 0x22,转换成十进制就是 34,和用十进制数据相除得到的 34.534 基本一致了(时长单位是秒)。

以上只是个简单例子,说明完全可以去手动解析 MP4 文件获取它的格式信息。

而且在这个层面上还有一些独特的用法:比如我们要想提取视频中的某个 Box 信息,或者想要填充自定义的 Box 格式,携带一些私有数据,在播放时再把它解析出来做处理。

在接下来的文章,我们就会去实践手动解析 MP4 文件,逐一拆解每个 Box 格式,发掘其背后的另一种用法,加强对音视频的处理能力。

最后欢迎大家加入 音视频开发进阶 知识星球 ,这里有知识干货、编程答疑、开发教程,还有很多精彩分享。

更多内容可以在星球菜单中找到,随着时间推移,干货也会越来越多!!!

85115567d1b195b0fcb02c2bee9a8a03.png

给出 10元 优惠券,涨价在即,目前还是白菜价,基本上提几个问题就回本,投资自己就是最好的投资!!!

ae0b9b4227f6925fa5fd0205a7d0a7a1.png

加我微信 ezglumes ,拉你进技术交流群

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

Android NDK 免费视频在线学习!!!

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

7520320504bc4fda69303418df61c39b.gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,一般情况下,MP4文件需要先读取整个文件头部信息,才能够获取到视频和音频的相关信息,然后再根据视频和音频的相关信息读取具体的视频和音频数据,才能进行播放。因此,如果要播放一个完整的MP4文件,通常需要先将整个文件读取到内存,然后才能进行播放。不过,对于一些较大的MP4文件,这样的处理方式可能会导致内存的占用过高,因此需要采用一些特殊的技术,例如流式传输等方式来实现边读取边播放的效果。 ### 回答2: MP4是一种常见的音视频文件格式,它通常需要读取整个文件才能进行播放。这是因为MP4文件采用了封装(容器)格式,它将音频、视频和其他多媒体信息封装到同一个文件。因此,为了播放MP4文件,需要依次读取文件的封装头部信息、音频和视频数据。 首先,播放器需要读取MP4文件的封装头部信息,这些信息包括文件的格式、版本、封装流的结构等。这些信息能够帮助播放器正确地解析文件,并获取包含在文件的音视频数据的位置和格式。 接下来,播放器会读取音频和视频数据。MP4文件的音频和视频数据被分割成一系列的帧,每一帧包含一部分音频或视频信息。为了将音频和视频还原出来,播放器需要按照一定的顺序读取这些帧并进行解码。 在读取帧数据之前,播放器还可能需要读取一些其他的相关信息,比如索引表。索引表为播放器提供了快速定位音视频数据的能力,使得播放器能够在一个较大的MP4文件快速找到特定的帧或时间点。 因此,MP4文件的播放需要逐个地读取文件的封装头部信息、音频和视频数据,并进行解析和解码。这样才能将音频和视频还原出来,并通过播放器呈现给用户观看和听取。 ### 回答3: MP4是一种常见的视频文件格式,它是通过将音频和视频编码压缩为一个单独的文件来实现高质量的播放效果。要播放MP4文件,需要将整个文件读取到设备的内存,然后对其的音频和视频数据进行解码和播放。 首先,设备会读取MP4文件文件头,这包含了文件的元数据信息,如分辨率、码率、音频格式等。然后,设备会根据这些元数据信息来分配内存空间,用于存储解码后的音频和视频数据。 接下来,设备会对MP4文件进行解码。它会逐帧地读取文件的音频和视频数据,并进行解压缩和解码,以恢复原始的音频和视频信号。然后,设备会使用解码后的数据来渲染音频和视频画面,从而实现播放效果。 由于MP4文件是按顺序存储的,每个帧都依赖于前面的帧,所以需要读取整个文件才能正确解码和播放。即使只需要播放一部分视频,设备也需要先读取整个文件,然后再根据需要来播放指定的部分。 总之,为了播放MP4文件,设备需要读取整个文件并解码其的音频和视频数据。这样可以保证音频和视频的连贯性和稳定性,从而实现高质量的视频播放体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值