13

007 | 播放器系列专栏-解析 MP4 文件读取信息

 3 years ago
source link: https://glumes.com/post/ffmpeg/007-parse-mp4-info/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一个专注音视频领域问答的小圈子

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

ftyp
moov
    mvhd
    trak
        tkhd
        mdia
    trak
        tkhd
        mdia
mdat

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

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

解析 MP4 文件获取信息

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

mp4-010-editor111.png

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

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

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

20220612231019.png

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

20220613191456.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 格式,发掘其背后的另一种用法,加强对音视频的处理能力。

一个专注音视频领域问答的小圈子

公众号音视频开发进阶对应的知识星球,一个编程开发领域的专业圈子,贩卖知识和技巧!

※ 入群须知:了解该星球能提供的价值和帮助,在提问时务必阐述好背景,附带相关的信息。

iOS 用户可以加我微信 ezglumes 邀请你进星球,有疑问也可以加我微信咨询。

※ 星球内容:

基础教程:

在知识星球连载的干货教程,可以在专栏中找到,随着时间的推移,教程也会越来越多:

- 音视频基础概念
- WebRTC 入门教程及源码实践
- 播放器教程及源码实践
- OpenGL 和特效开发教程
- Vulkan 入门教程

部分内容可以在博客 https://glumes.com 中检索到,后面会在星球里持续更新.

干货分享:

涵盖了移动开发和音视频工程领域的绝大部分,从项目实战角度出发,提升能力,包括但不限于以下领域:

- Android/iOS 移动开发
- Camera 开发
- 短视频编辑 SDK 项目实践
- 在线直播和推流
- WebRTC 开发
- 播放器基础和提高
- OpenGL 图像渲染及特效开发
- C++ 基础和提高
- FFmpeg 使用和分析
- 干货资源和书籍分享

不止于技术方面的,各种 IT 新闻、茶余饭后、生活趣事也欢迎大家分享!!!

技术答疑解惑:

针对上述基础教程和干货分享的答疑,另外还有音视频和 IT 开发中的各种交流讨论。

- 基础知识点答疑
- 工业项目实践答疑
- 问题排查思路分析

一个 BUG 排查很久,不如来星球里提个问题,效率提升百倍。

求职和面试辅导:

一站式职场服务,每份工作都值得用心对待!!!

- 面试题和面试经验分享
- 简历修改和模拟面试
- 大厂内推和信息同步
- 职场经验分享
- 职业规划和发展分析

※ 星主和合伙人介绍

星主是公众号音视频开发进阶的作者,也是网站 https://glumes.com 的作者,曾参与过抖音、剪映等头部音视频 APP 底层 SDK 的开发。

合伙人也是在头条、快手从事音视频架构师的职位,具有多年的音视频开发经验,能力圈覆盖了音视频的绝大多数领域,资深音视频从业人员为你保驾护航。

blog_image20220326202642.png

微信公众号

扫描下面的二维码关注我的微信公众号《音视频开发进阶》,推送更多精彩内容!

添加我的微信 ezglumes 拉你入音视频与图形图像技术群一起交流学习~

wechat-account-qrcode

原创文章,转载请注明来源:    007 | 播放器系列专栏-解析 MP4 文件读取信息


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK