type
status
date
slug
summary
tags
category
icon
password
Property
Mar 18, 2023 02:12 AM

基础知识

MP4 简介

mp4 ⽂件格式⼜被称为 MPEG-4 Part 14,出自 MPEG-4 标准第 14 部分 。它是⼀种多媒体格式容器,⼴泛用于包装视频和⾳频数据流、海报、字幕和元数据等。(顺便⼀提,目前流行的视频编码格式 AVC/H264 定义在 MPEG-4 Part 10)。 mp4 ⽂件格式基于 Apple 公司的 QuickTime 格式,因此,QuickTime File Format Specification 也可以作为我们研究 mp4 的重要参考。

MP4 文件结构

  • 在MP4文件中,数据被组织成一个个的"track",每个track包含一个或多个"chunk",每个chunk又包含多个"sample":
    • Track:MP4文件可以包含一个或多个track,每个track代表不同的媒体类型,比如音频、视频或字幕等。每个track由一个唯一的ID来标识,并包含一些元数据,比如媒体类型、时长、码率等
    • Chunk:每个track被分成一个个的chunk,每个chunk包含一定数量的sample。chunk是为了优化数据的读取而存在的,通过将大的数据块分成小的chunk,可以更快地从文件中读取所需数据。每个chunk包含一个唯一的ID和一些元数据,比如大小、偏移量等
    • Sample:每个chunk又由多个sample组成,sample是最小的音频或视频单元。比如一个视频文件可以被分成多个chunk,每个chunk包含数秒的视频数据,每个chunk又被分成多个视频帧(sample),每个视频帧就是一个独立的图像帧。同样的,一个音频文件也可以被分成多个chunk,每个chunk包含数秒的音频数据,每个chunk又被分成多个音频采样(sample),每个采样就是一个独立的声音样本。每个sample包含一些元数据,比如采样率、位深度、编码格式等
  • mp4 ⽂件由 box 组成,每个 box 分为 Header 和 Data。其中 Header 部分包含了 box 的类型和大小,Data 包含了子 box 或者数据,box 可以嵌套子 box。 下图是⼀个典型mp4文件的基本结构(可在 MP4Box 的 Box View 查看):
    • notion image
      notion image
  • MP4 ⽂件的基本组成单元是 box,也就是说 MP4 文件是由各种各样的 box 组成的,有 parent box,还有 children box。因此,这些 boxes 之间存在⼀定的层次关系,总结如下表所示,表中标记出了各个 box 必选或可选特性,√ 代表 box 必选:
notion image
notion image
notion image
notion image
notion image
notion image

ftyp(File Type Box)

notion image

mdat(Media Data Box)

notion image

moov(Movie Box)

notion image
notion image
Moov Insider
mp4 的媒体数据信息主要存放在 Moov Box 中,是我们需要分析的重点。moov 的主要组成部分如下:
  • mvhd(Movie Header Box)
    • notion image
      notion image
  • udta(User Data Box):自定义数据
  • track(Track Box)
    • notion image
  • tkhd(Track Header Box)
    • notion image
      notion image
      notion image
      notion image
      notion image
       
  • mdia(Media Box):
    • notion image
      notion image
  • mdhd(Media Header Box):存放视频流创建时间,长度等信息
    • notion image
      notion image
      notion image
  • hdlr(Handler Reference Box):媒体的播放过程信息
    • notion image
      notion image
      notion image
      notion image
  • minf(Media Information Box)
    • notion image
      notion image
      notion image
Stbl Insider
  • stbl(Sample Table Box)
    • notion image
      notion image
      notion image
  • stsd(Sample Description Box):存放解码必须的描述信息
    • notion image
      notion image
      notion image
      notion image
      notion image
      notion image
      notion image
  • stts(Time-to-Sample Box)
    • notion image
      notion image
      notion image
  • stss(Sync Sample Box):同步sample表,存放关键帧列表,关键帧是为了⽀持随机访问
    • notion image
      notion image
  • stsc(Sample-To-Chunk Box)
    • notion image
      notion image
      notion image
      notion image
  • stsz(Sample Size Box):指定了每个 sample 的 size。Sample Size Atom 包含两 sample 总数和⼀张包含了每个 sample size 的表
    • notion image
      notion image
  • stco(Chunk Offset Box)
    • notion image
      notion image
      notion image
      notion image

如何计算 sample 偏移位置

上文提到通过 stco 并不能直接获取某个 sample 的偏移位置,下⾯举例说明如何获取某⼀个 pts 对应的 sample 在⽂件中的位置。
大体需要以下步骤:
notion image
notion image
notion image
FFmpeg 解封装 MP4 媒体文件FFmpeg 对 FLV 文件进行解码