多媒体⽂件格式(⼀):MP4格式
在互联⽹常见的格式中,跨平台最好的应该就属MP4⽂件了。因为MP4⽂件既可以在PC平台的Flashplayer中播放,⼜可以在移动平台的Android、iOS等平台中进⾏播放,⽽且使⽤系统默认的播放器即可以播放。
MP4格式是最常见的多媒体⽂件格式。
⼀、MP4 格式标准介绍
MP4格式标准为ISO-14496 Part 12、ISO-14496 Part 14,标准内容不是很多,下⾯我们来介绍⼀下格式标准中⼀些重要的信息。
MP4是⼀种描述较为全⾯的容器格式,被认为可以在其中嵌⼊任何形式的数据,各种编码的视频、⾳频等都不在话下,常见的⼤部分的MP4⽂件存放的AVC(H.264)或MPEG-4(Part 2)编码的视频和AAC编码的⾳频。MP4格式的官⽅⽂件后缀名是“.mp4”,还有其他的以mp4为基础进⾏的扩展或者是阉割版的格式,如:M4V, 3GP, F4V等。
MP4是由⼀个个“Box”组成的,⼤Box中存放⼩Box,⼀级嵌套⼀级来存放媒体信息。下⾯我们来楚关于Box的⼏个概念:MP4⽂件由许多个Box与FullBox组成。
每个Box由Header和Data两部分组成。视频文件修复
FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和24的flags标志。
Header包含了整个Box的长度的⼤⼩(size)和类型(type),当size等于0时,代表这个Box是⽂件的最后⼀个Box。当size等于1时,说明Box长度需要更多的位来描述,在后⾯会⾃定义⼀个64位的largesize⽤来描述Box的长度。当type等于uuid时,说明这个Box 中的数据是⽤户⾃定义扩展类型。
Data为Box的实际数据,可以是纯数据,也可以是更多的⼦Box。
当⼀个Box中Data是⼀系列的⼦Box时,这个Box⼜可以称为Container(容器)Box。
介绍了MP4的格式标准后,下⾯我们来介绍是三个MP4分析⼯具,为后续理解MP4⽂件⼀些关键信息做辅助⼯具。
⼆、MP4分析⼯具
可以⽤来分析MP4封装格式的⼯具⽐较多,除了FFmpeg、FFprobe之外,还有⼀些常⽤的⼯具,如Elecard StreamEye、mp4box、
mp4info等;下⾯简单介绍⼀下这⼏款常⽤的⼯具:
1. Elecard StreamEye
Elecard StreamEye是⼀款⾮常强⼤的视频信息查看⼯具,能够查看帧的排列信息,将I帧、P帧、B帧以不同颜⾊的柱状展现出来,⽽且柱的长短将根据帧的⼤⼩展⽰。还能够通过Elecard StreamEye分析MP4的封装的内容信息,包括流信息、宏块的信息、⽂件头顶额信息、图像的信息以及⽂件的信息等。还能根据每⼀帧的顺序逐帧查看,可以看到每⼀帧的详细信息与状态。
⽰例如图:
2. mp4box
mp4box 是GPAC项⽬中的⼀个组件,可以通过mp4box针对媒体⽂件进⾏合成、拆解等操作。
其使⽤时的常⽤命令如下:
1) mp4box -h
查看mp4box中的所有帮助信息
2) mp4box -h general
查看mp4box中的通⽤帮助信息
3) mp4box -info test.mp4
查看test.mp4⽂件是否有问题
4) mp4box -add test.mp4 test-new.mp4
修复test.mp4⽂件格式不标准的问题,并把新⽂件保存在test-new.mp4中
5) mp4box -inter 10000 test-new.mp4
解决开始播放test-new.mp4卡⼀下的问题,为HTTP下载快速播放有效,10000ms
6) mp4box -add file.avi new_file.mp4
把avi⽂件转换为mp4⽂件
7) mp4box -hint file.mp4
为RTP准备,此指令将为⽂件创建RTP提⽰跟踪信息。这使得经典的流媒体服务器像darwinstreamingserver或QuickTime的流媒体服务器通过RTSP/RTP传输⽂件
8) mp4box -cat test1.mp4 -cat test2.mp4 -new test.mp4
把test1.mp4和test2.mp4合并到⼀个新的⽂件test.mp4中,要求编码参数⼀致
9) mp4box -force-cat test1.mp4 -force-cat test2.mp4 -new test.mp4
把test1.mp4和test2.mp4强制合并到⼀个新的⽂件test.mp4中,有可能不能播放
10) mp4box -add video1.264 -cat video2.264 -cat video3.264 -add audio1.aac -cat audio2.aac -cat audio3.aac -new muxed.mp4 -fps 24
合并多段⾳视频并保持同步
11) mp4box -split *time_sec* test.mp4
切取test.mp4中的前⾯time_sec秒的视频⽂件
12) mp4box -split-size *size *test.mp4
切取前⾯⼤⼩为size KB的视频⽂件
13) mp4box -split-chunk *S:E* test.mp4
切取起始为S少,结束为E秒的视频⽂件
14) mp4box -add 1.mp4#video -add 2.mp4#audio -new test.mp4
test.mp4由1.mp4中的视频与2.mp4中的⾳频合并⽣成
⽽通过mp4box也可以查看mp4的信息,其输出内容格式⾮常类似ffprobe查看的信息,不过想对ffprobe更完善。
3. mp4info
mp4info是⼀个不错的MP4分析⼯具,⽽且是可视化的⼯具,可以将MP4中的各个Box解析出来,并将其中的数据展现出来。分析MP4⽂件内容时使⽤mp4info将会更⽅便。
结合着此⼯具,理解MP4的Box会更⽅便,更直观。
三、MP4格式重要Box
1. 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。
2. 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。
3. 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。
4. mdat(Meida Data Box)
该box包含于⽂件层,可以有多个,也可以没有(当媒体数据全部为外部⽂件引⽤时),⽤来存储媒体数据。数据直接跟在box type字段后⾯,具体数据结构的意义需要参考metadata(主要在sample table中描述)。
5. free或skip(Free Space Box)
“free”中的内容是⽆关紧要的,可以被忽略。该box被删除后,不会对播放产⽣任何影响。
6. stbl(Sample Table Box)
“stbl”⼏乎是普通的MP4⽂件中最复杂的⼀个box了,⾸先需要回忆⼀下sample的概念。sample是媒体数据存储的单位,存储在media
的chunk中,chunk和sample的长度均可互不相同,如下图所⽰。
普通MP4⽂件的结构重要的部分就讲完了,理解起来可能⽐较乱,下⾯这张图是常见的box的树结构图,可以⽤来⼤致了解MP4⽂件的构造。
在MP4⽂件中,Box的结构与上图中所描述的⼀般没太⼤的差别。
四、MP4格式与 FFmpeg实战
1. 在FFmpeg中的输出MP4的Demuxer信息
使⽤命令⾏ ffmpeg -h demuxder=mp4 查看MP4⽂件的Demuxer信息:
Demuxer mov,mp4,m4a,3gp,3g2,mj2 [QuickTime / MOV]:
Common extensions: mov,mp4,m4a,3gp,3g2,mj2.
2. 通过FFmepg faststart参数的使⽤,来理解mdat和moov的顺序的意义
正常情况下,ffmpeg⽣成的moov是在mdat写完成后再写⼊的。
下⾯是⼀个例⼦:
ffmpeg -i 好汉歌.flv -c copy -f mp4 好汉歌.mp4
使⽤mp4info查看容器出现的顺序,如图:
可以看出moov box是在mdat的下⾯。这时,我们可以使⽤faststart将上图的moov移动到mdat前⾯。
使⽤如下命令⾏:
ffmpeg -i 好汉歌.flv -c copy -f mp4 -movflags faststart 好汉歌.mp4
然后使⽤mp4info查看MP4的容器顺序,就可以看到moov被移动到mdat前⾯了。如下图所⽰:
因为MP4的标准中描述的moov与mdat的存放位置前后并没有强制要求,所有有些时候moov这个Box在mdat的后⾯,有时候在mdat的前⾯。
在互联⽹的视频点播中,如果希望MP4⽂件被快速打开,则需要moov存放在mdat的前⾯;如果放在后⾯,则需要将MP4⽂件下载完成后才可以进⾏播放。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论