可以分析MP4封装格式的工具比较多除了FFmpeg之外,还有一些常用工具,例如Elecard Stream Eye、MP4BOX、mp4info等;下面简单介绍一下这几款常见工 具:
8.1 Elecard Stream Eye
8.2 mp4box
mp4box是GPAC项目中的一个组件,可以通过mp4box针对媒体文件进行合成,拆解等操作,其操作信息大概如下:
下面可以使用mp4box分析一下output.mp4的信息,内容如下:
8.3 mp4info
mp4info也是一个不错的mp4分析工具,而且是可视化的工具,可以将mp4文件中的各box接触出来,并将其中的数据展现出来,分析mp4内容时使用mp4info将会更方便:
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的容器出现顺序
可以看到上图中moov容器是在mdat的下边,如果使用参数faststart就会在生成完上边结构之后将moov移动到mdat前面:
ffmpeg –i input.flv –c copy –f mp4 –movflags faststart output.mp4然后使用mp4info查看mp4的容器顺序,可以看到moov被移动到了mdat前面。
8.7 dash参数使用案例
当使用生成dash格式的时候,里面使用的一种特殊的mp4格式,可以通过dash参数进行生成:
ffmpeg –i input.flv –c copy –f mp4 –movflags dash output.mp4
使用mp4info查看容器格式信息,稍微有些特殊,具体的信息在前面均有介绍
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的格式,大致如下:
生成的文件格式的原理类似HLS,使用的XML格式进行索引,然后刷新切片内容进行直播。