2013-03-27 93 views
15

我看到噸問題有關從MP4視頻容器開始結束搬遷moov原子,使視頻「網絡優化」或更容易流。似乎大多數工具在首次編碼視頻時都需要明確的選項來執行此操作,如果它可用的話。把MOOV原子放在MP4文件的開頭是否有缺點?

如果放置原子在開始使流工作得更好,這是昂貴的後 - 事實上這樣做,爲什麼我會永遠要編碼的視頻,並在最後的原子?有什麼好處?

回答

13

對文件末尾的MOOV進行編碼通常是視頻編碼器的默認操作,因爲它們傾向於通過一次寫入輸出文件來操作,並且只能知道MOOV原子的確切內容和大小完全寫入音頻和視頻數據後,因爲它包含絕對文件大小。

主要例子爲這是FFmpeg的,與在此答案中發現的解釋:https://stackoverflow.com/a/8066089/393701

FFmpeg的有一個選項保留空間此原子,但它不能保證數據將伏貼。

將MOOV原子放在最後並沒有特別的好處,但在本地播放的情況下,在播放前查找文件結尾並不像在漸進式下載傳送中那樣昂貴。

+2

這只是很難想象的是,在30分鐘服用,或一小時,或十,以創建編碼的影片的範圍,任何人都會注意額外的兩分鐘才能寫出來的MOOV原子,然後拷貝過來剩下的完成的數據段。當然,I/O成本是由編碼所需的計算放在首位? – Coderer 2013-03-27 15:36:49

+2

我想這取決於編碼軟件,但ffmpeg足夠通用,「在事實之後重寫文件」需要在當前狀態下進行重大重構。 FLV文件和元數據也存在類似的問題,因此在編碼之後需要使用像flvtool或flvmeta這樣的軟件來正確注入它們。我們還必須認識到,視頻編碼器並不總是將數據寫入可搜索的數據流(例如網絡數據流),而返回數據根本不可能。 – SirDarius 2013-03-27 16:03:09

+0

我知道這是不重要的,但我仍然會問; android的視頻元素只能播放mp4文件,所以即使moov元素仍然在最後仍然通過http流播放視頻而沒有任何問題。這怎麼可能?android如何處理沒有moov原子的視頻? – 2015-12-08 06:32:33

4

你總是希望把索引信息的文件的開頭,有此佈局,除了唯一一個沒有任何隱藏費用:一邊做捕獲/轉碼,你可能無法提前知道多少空間你在開始時需要MOOV原子,其數據也不太好。所以你通常直接將有效載荷寫入文件,然後通過添加MOOV和更新文件的其餘部分來完成寫操作。

相關問題