前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解MP4视频文件裁剪原理[上]

深入理解MP4视频文件裁剪原理[上]

作者头像
码农心语
发布2024-04-09 15:59:38
1040
发布2024-04-09 15:59:38
举报
文章被收录于专栏:码农心语码农心语
  1. 引言

  随着数字媒体的迅速发展,视频成为人们生活中不可或缺的一部分。MP4(Moving Picture Experts Group 4)作为一种常见的视频文件格式,被广泛应用于各种领域,包括电视、电影、广告和网络媒体等。然而,有时我们需要对MP4文件进行裁剪,以满足特定的需求,例如提取出一部电影中的某个片段,或者创建个性化的视频内容。

  深入理解MP4文件裁剪原理,不仅可以帮助我们更好地理解MP4文件的内部结构和编码方式,还能够为我们提供有效的工具和技术,使我们能够准确、高效地进行MP4文件的裁剪操作。本文将通过介绍MP4文件的基本概念和组织结构,来详细解释MP4文件裁剪的原理和方法。

  本文涉及的对MP4视频文件的裁剪只涉及MP4的封装层的内容,而不涉及CODEC层的音视频解码和编码的内容,裁剪完成后,不会对视频的画质有任何影响。

  1. MP4文件的结构

   MP4的文件结构规范在ISO/IEC 14496-12标准中进行定义。以下是结合自己的理解,对MP4格式进行说明。  MP4文件以box(也叫做atom)作为基本单位来组织的,一个MP4本身是一个大的box,每个box又可以嵌套其他子box,形成一种大盒套小盒的套娃结构。

2.1 Box的格式

  MP4包括两种box格式,一种是32位box格式,如图1,另外一种是64位box格式,如图2。当box的前面4个字节的32位整型值是1的时候,表示这是一个64位的box格式,另外用从第8到第15字节共8个字节表示box的大小,其他和32位box的格式是一样的。以下对各个部分进行说明:

  • size32: 即box的长度字段,该字段包括了整个box的长度,并且采用的是大端模式,即网络字节格式。如果size32=1,表示这是一个64位box。如果size32=0,表示这是文件的最后一个box,其大小为整个文件的剩余部分。
  • size64:当64位box的时候,用来表示box的大小。
  • name: box的名字,每个box都有一个4字符的名字,如ftyp、moov、mdat、free等等。
  • version:版本号,占一个字节(非必须),是否有version字段依赖于box的类型。
  • flags:标记,占三个字节(非必须),是否有version字段依赖于box的类型。
  • body:用于存储对应的数据内容(可变长度)

  在规范中,将带有version和flags两个字段的box称为fullbox,是不是fullbox是依赖于box的类型的,譬如mvhd box就是一个fullbox,而ftyp则不是一个fullbox。

图1 图2

2.1 MP4文件格式架构

  从MP4文件的顶层来看,一般如下图3或者下图4所示,包括ftype、free、moov、mdat四种box。其中mdat和moov box的顺序可以颠倒,而free box则不是必须的。

图3 图4

  下图是一个典型的MP4文件的整体架构,如下图5:

图5

在进行mp4裁剪的时候,我们主要关心的是对moov box中的内容,需要对它内部的box进行裁剪,调整索引等操作,特别是途中标出来的stbl box下面的那些box,另外就是对mdat按照裁剪需求将不需要的音视频帧进行丢弃。

  下图6显示了两个trak的音视频帧的组织架构:

图6

  其中trak1包含了4个chunk,每个chunk又包含数量不定的sample(即音视频帧), 而trak2包含了5个chunk,每个chunk也包含了数量不定的sample。

最终,各个trak的chunk会被interlace即交错排列存放到mat box中,这样有助于播放器按顺序读取并进行解码,而不需要同步播放不同的trak的时候,要在MP4文件中不断来回跳转。  

经过interlace后,最后排列在mdat中的顺序可能如下图7所示:

图7

从上图可以看到,trak1和trak2的chunk已经被交错排列了。MP4采用chunk+sample的两层结构,虽然一定程度上增加了复杂性,但是有助于stbl中的数据压缩。

  下面对裁剪过程中需要处理的box的格式进行重点说明,以下各个box的标题中,凡是标了*的都是需要在裁剪过程中进行调整的box,而没有标*的则只要将原来的内容直接拷贝输出即可。

  1. MP4各box

3.1 ftyp box

  ftyp body依次包括1个32位的major brand(4个字符)、1个32位的minor version(整数)和1个以32位(4个字符)为单位元素的数组compatible brands。对于mp4裁剪的需求,ftyp box基本上不需要太关心,只要复制原有的内容即可。

3.2 free box

  free box就是一个空的box,它的名字可以是free或者是skip,发现这个box,是可以直接跳过的。free box的作用包括:

  • 填充未使用的空间: 当MP4文件中存在未使用的空间时,可以使用Free Box来填充这些空间,以确保文件的连续性和一致性。这有助于避免文件碎片化和浪费存储空间。
  • 调整文件大小: 在某些情况下,可能需要调整MP4文件的大小,例如在追加数据或删除数据后。通过插入或删除Free Box,可以增加或减少文件的大小,以适应新的数据大小。

  free box在裁剪的过程中也基本上不用关心,只要复制原有的内容即可。

3.3 mdat box*

  mdat box包含的就是音视频数据,而要访问mdat中的音视频数据,又必须通过moov box中记录的帧的偏移和大小来,才能读取该帧在mdat中音视频帧的数据。mdat box的格式也很简单,如下图8:

图8

图8列出了mdat的两个版本,分别对应32位box和64位box。mdat box需要根据需求对帧数据进行裁剪,重新组织出一个裁剪后的新的mdat box。

3.4 moov box*

  moov box本身是一个容器,它包括其他子box。如下图9:

图9

  moov box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,所以moov box本身的大小在裁剪后也需要跟着调整。

3.5 mvhd box*

  mvhd box是一个full box,即带有version和flags字段。详细结构如下图10,图11。

图10 图11

  根据version字段的值的不同,用于表示时间的create_time、modification_time和duration三个字段可以是32位的或者是64位的,当version=0时,采用32位的版本,而当version!=0时,采用64位版本。  在裁剪MP4的时候,因为视频变短了,我们需要调整这个duration字段,调整duration字段的时候需要关注timescale设置的时间单位,将调整后的duration字段要变换为timescale规定的时间单位。

3.6 trak box*

  trak box本身是一个容器,它包括其他子box。如下图12:

图12

trak box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,所以trak box本身的大小在裁剪后也需要跟着调整。

  在mp4文件中,每条音频或者视频流会对应一个 trak。

  trak box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,trak box本身的大小在裁剪后也需要跟着调整。

3.7 tkhd box*

  tkhd box描述了trak的详细信息。tkhd box是一个full box,即带有version和flags字段。详细结构如下图13,图14。

图13 图14

  根据version字段的值的不同,用于表示时间的create_time、modification_time和duration三个字段可以是32位的或者是64位的,当version=0时,采用32位的版本,而当version!=0时,采用64位版本。  在裁剪MP4的时候,因为视频变短了,我们需要调整这个duration字段,调整duration字段的时候需要关注mvhd box中的timescale设置的时间单位,将调整后的duration字段要变换为timescale规定的时间单位。

3.8 mdia box*

  mdia box本身是一个容器,它包括其他子box。如下图15:

图15

  mdia box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,mdia box本身的大小在裁剪后也需要跟着调整。

3.9 mdhd box*

  mdhd box描述了与媒体无关且与trak中媒体特性相关的总体信息。mdhd box是一个full box,即带有version和flags字段。详细结构如下图16,图17。

图16 图17

  根据version字段的值的不同,用于表示时间的create_time、modification_time和duration三个字段可以是32位的或者是64位的,当version=0时,采用32位的版本,而当version!=0时,采用64位版本。  

在裁剪MP4的时候,因为视频变短了,我们需要调整这个duration字段,调整duration字段的时候需要关注box中的timescale设置的时间单位,将调整后的duration字段要变换为timescale规定的时间单位。

3.10 hdlr box

  hdlr box解释了媒体的播放过程信息,用来设置不同Track的处理方式,标识了该Track的类型,音频Track的handler为soun,视频Track的handler为video。对于MP4的裁剪来说不需要处理,直接拷贝即可。

3.11 minf box*

  minf box本身是一个容器,它包括其他子box。如下图18:

图18

  minf box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,minf box本身的大小在裁剪后也需要跟着调整。

3.12 vmhd box

   视频trak使用vmhd box来描述展示信息。这个box的内容在裁剪操作的时候不用关心,直接拷贝即可。

3.13 smhd box

   音频trak使用smhd box来描述展示信息。这个box的内容在裁剪操作的时候不用关心,直接拷贝即可。

3.14 dinf box

   dinf box是一个容器,包括一个或者多个子dref box,但是这个box的内容在剪裁操作的时候不用关心,所以也就不用解析其子dref box,直接拷贝即可。

3.15 stbl box*

  stbl box本身很简单,需要关注的是它的子box,而且由于它的子box可能会被裁剪而改变原始的大小,stbl box本身的大小在裁剪后也需要跟着调整。

3.16 stsd box

   本box用来描述媒体轨道中每个样本的编解码器和参数。STSD Box包含了一个或多个Sample Entry,每个Sample Entry描述了一个媒体样本的编解码器和参数。STSD Box的作用是提供有关媒体样本的编解码器和参数的信息,以便解码器和播放器能够正确地解码和呈现媒体数据。通过解析STSD Box中的Sample Entry,可以了解媒体样本的格式和编码类型,从而选择正确的解码器和解码参数,以实现媒体的播放和展示。譬如存放H264的sps/pps帧的信息。

  对于MP4文件的裁剪操作,这里不需要关心这个帧的内容,直接拷贝即可。

<未完待续>

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农心语 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 Box的格式
    • 3.1 ftyp box
      • 3.2 free box
        • 3.3 mdat box*
          • 3.5 mvhd box*
            • 3.6 trak box*
              • 3.7 tkhd box*
                • 3.8 mdia box*
                  • 3.9 mdhd box*
                    • 3.11 minf box*
                      • 3.12 vmhd box
                        • 3.13 smhd box
                          • 3.14 dinf box
                            • 3.15 stbl box*
                              • 3.16 stsd box
                              相关产品与服务
                              容器服务
                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档