
我有一部 1 分 15 分鐘長的 mp4 電影,是用 Sony Alpha 6400 4k 相機製作的。它的大小為 528MB。我想用 來切割它ffmpeg
。雖然只剪了幾秒鐘,但新視頻很多較小。因此,我對原始未剪切檔案進行了一些測試,發現沒有任何選項的處理本身會產生更小的檔案:
ffmpeg -i C0034.MP4 C0034_ffmpeg.MP4
輸出檔案C0034_ffmpeg.MP4
僅使用 102MB 空間。大約是輸入檔的 1/5,沒有應用任何可以減小檔案大小的選項,例如每秒更少的幀數、更小的解析度等。
預設
根據文件:
預設是一組選項,將提供一定的編碼速度與壓縮比。
據我了解,這相當於-mx=X
7zip的開關:壓縮等級越高意味著檔案越小。需要更長的時間,但文件的品質不受影響。
ffmpeg預設是medium。我將其更改為veryslow
並獲得了一個 83.4 MB 的文件,而同一文件在ultrafast
.從最強壓縮到最低壓縮,大約有 66 MB 的顯著差異。但甚至ultrafast
仍然比原始輸入檔小 379 MB,因此預設medium
預設似乎無法解釋大部分差異。
這恆定速率因子(綜合報告表)
這ffmpeg 的同一篇 H264 文章顯示 CRF。根據文檔,它是大多數用途推薦的速率控制模式。這似乎是 ffmpeg 用來確定品質和檔案大小的一個因素。
CRF 等級的範圍是 0-51,其中 0 是無損的,23 是預設的,51 是可能的最差品質。
由於它使用 23 作為預設值,因此從技術上講我們無法獲得無損輸出檔案。但它也解釋了為什麼這些輸出檔看起來並不比輸入檔差,儘管它們小得多:
考慮 17 或 18 視覺上無損或接近無損;它應該看起來與輸入相同或幾乎相同,但從技術上講它並不是無損的。
透過嘗試,似乎 CRF 對檔案大小的影響比預設大得多(這似乎很明顯,因為預設僅處理壓縮,而 CRF 則處理品質)。我嘗試了一些沒有預設的組合(因此使用預設值):
-crf 23
~> 102 MB(預設)-crf 20
〜> 189 MB-crf 18
〜> 285 MB-crf 17
〜> 347 MB-crf 0
〜> 2,64 GB
從第一次測試中,我假設找到了原因:CRF 對檔案大小有巨大的影響,即使 23 和 17 之間沒有明顯的差異(至少對我來說不是)。
但我真的想知道-crf 0
(這意味著無損)如何比原始輸入檔大近 5 倍?從巨大的差異中,我猜測輸出檔案的品質比輸入檔案更好。這怎麼可能?怎樣使ffmpeg
輸出檔變得那麼大?
答案1
並非所有編碼器都是一樣的
x264 是一種高效的 H.264 編碼器,這意味著它可以以較低的位元率輸出高品質的內容。 x264 使用奇特的「心理視覺」技巧來欺騙眼睛,以節省效率較低的編碼器可能缺乏的位。
由於其他優先事項(更少的資源、所需的最低編碼速度、電池壽命等),相機和手機上的 H.264 編碼器必須做出更多妥協。因此,即使它們製作相同的格式,它們的效率也可能非常低,這意味著它們無法以相同的位元率匹配 x264。
x264 的預設設定很好,因此一般使用者通常看不到品質差異,儘管檔案大小可能會顯著減少。
無損是巨大的
設定-crf 0
採用特殊的壓縮無損模式。大多數減小檔案大小的技巧都不能在無損模式下使用。
處理無損時不應考慮輸入檔大小。輸入被完全解碼為未壓縮的原始影片:影片的基本構建塊。原始影片是無損的,但由於未壓縮,因此檔案大小最大。然後,無損編碼器會取得原始影片並對其進行一定程度的壓縮,但仍保持無損。與 ZIP 類似,但專為視訊而設計。比原始影片小,但不像典型的有損 H.264 那麼小,因為它無法使用所有花哨的技巧。不然就不再是無損的了。
不可能創建比輸入品質更好的輸出。其質量只能小於或等於。無論格式或編碼器。