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
可以观察Stream的格式,大致如下:
生成的文件格式的原理类似HLS,使用的XML格式进行索引,然后刷新切片内容进行直播。