正常情況下ffmpeg生成moov是在mdat寫完成之後寫入

可以分析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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章