可以分析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格式進行索引,然後刷新切片內容進行直播。
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=11344913&id=5750792