可以分析MP4封装格式的工具比较多除了FFmpeg之外,还有一些常用工具,例如Elecard Stream Eye、MP4BOX、mp4info等;下面简单介绍一下这几款常见工具:

8.1 Elecard Stream Eye

8.2 mp4box

mp4box是GPAC项目中的一个组件,可以通过mp4box针对媒体文件进行合成,拆解等操作,其操作信息大概如下:

正常情况下ffmpeg生成moov是在mdat写完成之后写入_数据

下面可以使用mp4box分析一下output.mp4的信息,内容如下:

正常情况下ffmpeg生成moov是在mdat写完成之后写入_直播流_02

8.3 mp4info

mp4info也是一个不错的mp4分析工具,而且是可视化的工具,可以将mp4文件中的各box接触出来,并将其中的数据展现出来,分析mp4内容时使用mp4info将会更方便:

 正常情况下ffmpeg生成moov是在mdat写完成之后写入_直播流_03

8.4 MP4在ffmpeg中的demuxer

通过查看ffmpeg的help信息,可以看到mp4的demuxer与mov、3gp、m4a、3g2、mj2的demuxer相同,解析mp4文件时参数如下:


参数



类型



说明



use_absolute_path



布尔



可以通过绝对路径加载外部的tracks,可能会有安全因素的影响,默认不开启



seek_streams_individually



布尔



根据单独流进行seek,默认开启



ignore_editlist



布尔



忽略EditList Atom信息,默认不开启



ignore_chapters



布尔



忽略Chapters信息,默认不开启



enable_drefs



布尔



外部track支持,默认不开启












8.5 MP4在ffmpeg中的muxer

在前面一节提到,mp4与mov、3gp、m4a、3g2、mj2的demuxer相同,而muxer中差别不大,但是是不同的muxer,尽管在ffmpeg中都是使用的同一套format进行的Mux与Demux。Mp4的mux相对demux来说稍微复杂一些,因为要封装的时候可选参数多一些,可以通过下表了解相关的参数:


参数





说明



movflags






MP4 Muxer 标记






rtphint



增加RTP的hint track






empty_moov



初始化空的moov box






frag_keyframe



在视频关键帧处切片






separate_moof



每一个Track写独立的moof / mdat box






frag_custom



每一个caller请求时Flush一个片段






isml



创建实时流媒体(创建一个直播流发布点)






faststart



将moov box移动到文件的头部






omit_tfhd_offset



忽略tfhd容器中的基础数据偏移






disable_chpl



关闭Nero Chapter容器






default_base_moof



在tfhd容器中设置default-base-is-moof标记






dash



兼容DASH格式的mp4分片






frag_discont



分片不连续式设置discontinuous信号






delay_moov



延迟写入moov信息,直到第一个分片切出来,或者第一片被刷掉






global_sidx



在文件的开头设置公共的sidx索引






write_colr



写colr容器






write_gama



写被弃用的gama容器



moov_size



正整数



设置moov容器的最大大小



rtpflags






设置rtp传输相关的标记






latm



使用MP4A-LATM方式传输AAC音频






rfc2190



使用RFC2190传输H.264H.263






skip_rtcp



忽略使用RTCP






h264_mode0



使用RTP传输mode0的H264






send_bye



当传输结束时发送RTCP的BYE包



skip_iods



布尔型



不写入iods容器



iods_audio_profile



0-255



设置iods的音频profile容器



iods_video_profile



0-255



设置iods的视频profile容器



frag_duration



正整数



切片最大的duration



min_frag_duration



正整数



切片最小的duration



frag_size



正整数



切片最大的大小



ism_lookahead



正整数



预读取ISM文件的数量



video_track_timescale



正整数



设置所有视频的时间计算方式



brand



字符串



写major brand



use_editlist



布尔型



使用edit list



fragment_index



正整数



下一个分片编号



mov_gamma



0-10



Gama容器的gama值



frag_interleave



正整数



交错分片样本



encryption_scheme



字符串



配置加密的方案



encryption_key



二进制



秘钥



encryption_kid



二进制



秘钥标识符


8.6 faststart使用案例

正常情况下ffmpeg生成moov是在mdat写完成之后写入,可以通过参数faststart将moov容器移动至mdat前面,下面参考一个例子:

ffmpeg –i input.flv –c copy –f mp4 output.mp4

然后使用mp4info查看output.mp4的容器出现顺序

正常情况下ffmpeg生成moov是在mdat写完成之后写入_数据_04

可以看到上图中moov容器是在mdat的下边,如果使用参数faststart就会在生成完上边结构之后将moov移动到mdat前面:

ffmpeg –i input.flv –c copy –f mp4 –movflags faststart output.mp4然后使用mp4info查看mp4的容器顺序,可以看到moov被移动到了mdat前面。

正常情况下ffmpeg生成moov是在mdat写完成之后写入_数据_05

8.7 dash参数使用案例

当使用生成dash格式的时候,里面使用的一种特殊的mp4格式,可以通过dash参数进行生成:

ffmpeg –i input.flv –c copy –f mp4 –movflags dash output.mp4

使用mp4info查看容器格式信息,稍微有些特殊,具体的信息在前面均有介绍

正常情况下ffmpeg生成moov是在mdat写完成之后写入_数据_06

8.8 isml 参数使用案例

ismv为微软发布的一个流媒体格式,通过参数isml可以发布isml直播流,将ismv推流至IIS服务器,可以通过参数isml参数进行发布:

ffmpeg -re -i INUPT.mp4 -c copy -movflags isml+frag_keyframe -f ismv http://192.168.0.1/publish.isml/Stream

可以观察Stream的格式,大致如下:

 正常情况下ffmpeg生成moov是在mdat写完成之后写入_数据_07

生成的文件格式的原理类似HLS,使用的XML格式进行索引,然后刷新切片内容进行直播。