多媒体文件格式MP4剖析(MP4识别工具)

MP4基本介绍

MP4格式是目前应用最广泛的封装格式,良好的跨平台特性是其最大的优势。我们有必要了解一下MP4的基本格式信息 ,方便我们封装裸流信息。

MP4中封装了视频或者音频裸流信息 ,通常以.mp4为后缀,其实它是由一个一个的“BOX”组成的,大BOX中嵌套小BOX,逐级嵌套而形成的。

MP4识别工具

针对MP4文件的识别,有基本信息识别和BOX信息识别;

  • 基本信息:基本信息就是MP4的基本属性,宽高,track信息,以及track详情;
  • BOX信息:MP4由多少个BOX嵌套而成,每个BOX分别是什么,组成的位代表什么意思;

基本信息识别一般使用mp4info;


jeffmony@jeffmony-OptiPlex-7050:~/下载/Bento4-linux/bin$ ./mp4info test2.mp4
File:
  major brand:      isom
  minor version:    200
  compatible brand: isom
  compatible brand: iso2
  compatible brand: avc1
  compatible brand: mp41
  fast start:       yes

Movie:
  duration:   79756 ms
  time scale: 1000
  fragments:  no

Found 2 Tracks
Track 1:
  flags:        3 ENABLED IN-MOVIE
  id:           1
  type:         Video
  duration: 79580 ms
  language: und
  media:
    sample count: 1908
    timescale:    90000
    duration:     7162154 (media timescale units)
    duration:     79579 (ms)
    bitrate (computed): 543.192 Kbps
  display width:  960.000000
  display height: 540.000000
  frame rate (computed): 23.976
  Sample Description 0
    Coding:      avc1 (H.264)
    Width:       960
    Height:      540
    Depth:       24
    AVC Profile:          100 (High)
    AVC Profile Compat:   0
    AVC Level:            31
    AVC NALU Length Size: 4
    AVC SPS: [6764001facd940f0117ee100000303e90000bb800f183196]
    AVC PPS: [68ebe24b22c0]
    Codecs String: avc1.64001F
Track 2:
  flags:        3 ENABLED IN-MOVIE
  id:           2
  type:         Audio
  duration: 79756 ms
  language: und
  media:
    sample count: 1718
    timescale:    44100
    duration:     3517197 (media timescale units)
    duration:     79755 (ms)
    bitrate (computed): 32.020 Kbps
  Sample Description 0
    Coding:      mp4a (MPEG-4 Audio)
    Stream Type: Audio
    Object Type: MPEG-4 Audio
    Max Bitrate: 32019
    Avg Bitrate: 32019
    Buffer Size: 0
    Codecs String: mp4a.40.29
    MPEG-4 Audio Object Type: 29 (Parametric Stereo)
    MPEG-4 Audio Decoder Config:
      Sampling Frequency: 22050
      Channels: 1
      Extension:
        Object Type: Spectral Band Replication
        SBR Present: yes
        PS Present:  yes
        Sampling Frequency: 44100
    Sample Rate: 44100
    Sample Size: 16
    Channels:    2

这儿比较定量分析了MP4文件的基本构成,主要的识别方向在Track信息上,这个文件中发现了两个Track信息,一个音频Track,一个视频Track;
mp4info其实是mp4parser项目的变种,mp4parser实现了mp4 文件处理的所有操作;

  • 合并文件:test.h264和test.aac合成test.mp4,我们使用camera采集信息的时候,这样库很有帮助,帮我们合成一个mp4文件;
  • 合并两个 mp4文件,但是要求两个文件的编码格式一样 ,不然可能出现问题,一般在拼接视频功能上用到;

BOX信息识别一般使用mp4reader;

图片
图片

图中颜色加深的标识是MP4中核心的BOX信息;这张图非常清晰的表达了MP4的BOX封装特性,我们需要掌握MP4的每个BOX是什么意思;

  • ftyp(File Type Box)
    该Box有且只有1个,并且只能被包含在文件层,而不能被其他Box包含。该Box应该被放在文件的最开始,指示该MP4文件应用的相关信息。
    “ftyp” body依次包括1个32位的major brand(4个字符),1个32位的minor version(整数)和1个以32位(4个字符)为单位元素的数组Compatible Brands。
  • moov(Movie Box)
    该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。
    moov定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含三种Atom中的一种:mvhd标签、cmov标签、rmra标签。

mvhd标签:Movie Header Atom,存放未压缩过的影片信息的头容器。
cmov标签:Compressed Movie Atom,压缩的电影信息容器,此容器不常用。
rmra标签:Reference Movie Atom,参考电影信息容器,此容器不常用。
一般情况下,“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为Header Box,一般作为“moov”的第一个子Box出现(对于其他Container Box来说,Header Box都应作为首个子box出现)。“trak”包含了一个track的相关信息,是一个Container Box。
  • trak(Track Box)
    “trak”也是一个container box,其子box包含了该track的媒体数据引用和描述(hint track除外)。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。其中“tkhd”为track header box,“mdia”为media box,该box是一个包含一些track媒体数据信息box的container box。
  • mdat(Media Data Box)
    该box包含于文件层,可以有多个,也可以没有(当媒体数据全部为外部文件引用时),用来存储媒体数据。数据直接跟在box type字段后面,具体数据结构的意义需要参考metadata(主要在sample table中描述)。
  • stbl(Sample Table Box)
    stbl”几乎是普通的MP4文件中最复杂的一个box了,首先需要回忆一下sample的概念。sample是媒体数据存储的单位,存储在media的chunk中,chunk和sample的长度均可互不相同,如下图所示。
图片
图片

注意

学习了MP4的BOX信息,我们要知道,moov一般都在mdat之前,如果moov在mdat之后,在做边下边播的时候是无法播放的,因为moov是文件媒体的metadata信息,如果没有这个metadata信息,是无法继续解析mdat信息的。

这也间接说明了MP4文件并不是流式文件,它的诞生有很强的时代背景,在如今流式文件满天飞的时代,MP4是不能作为直播的封装格式存在的。

ffmpeg -i input.mp4 -movflags faststart output.mp4

这个指令可以将moov从mdat之后移到mdat之前。这样操作完成之后可以实现mp4视频的边下边播功能。

本文部分图片来自:https://www.cnblogs.com/renhui/p/10341555.html

作者:音视频平凡之路(关注该公众号——回复MP4获取一整套MP4工具)

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论