
我不想向 FFMPEG/libx264 (-r/-framerate) 提供固定幀速率,而是想指定具有最大值的可變幀速率,並允許 libx264 根據需要降低幀速率。這裡的想法是當存在諸如擴展靜止幀之類的情況時獲得額外的壓縮(這種情況發生很多在我的來源影片中)。
我意識到預測或雙向 MPEG 幀的壓縮效果非常好,但來源幀速率也可能小於我打算轉碼的幀速率(可能會產生更大的流!)。
答案1
很遺憾你也沒有找到答案,我至少會回答其他人關於如何啟用 VFR(而不是 V乙R) FFMPEG 的輸出。
答案是這個名字奇怪的-vsync
選項。您可以將其設定為幾個不同的選項,但您想要的選項是“2”或vfr
。從手冊頁:
-垂直同步 範圍
視訊同步方法。出於相容性原因,可以將舊值指定為數字。新新增的值必須始終指定為字串。
0、直通
- 每個幀及其時間戳從解復用器傳遞到復用器。
1、CFR
- 幀將被複製和丟棄,以準確實現所要求的恆定幀速率。
2、室顫
- 幀會連同其時間戳一起通過或丟棄,以防止 2 個幀具有相同的時間戳。
降低
- 作為直通,但會破壞所有時間戳,使復用器根據幀速率產生新的時間戳。
-1,自動
- 根據復用器功能在 1 和 2 之間選擇。這是預設方法。
請注意,在此之後,復用器可能會進一步修改時間戳記。例如,如果格式選項避免負面的ts已啟用。
使用 -map 您可以選擇應從哪個流中取得時間戳記。您可以保持視訊或音訊不變,並將剩餘的串流同步到未更改的串流。
然而,我沒有足夠的聲譽發表評論來回答每個人似乎都有的「子問題」。但我確實有一些想法,老實說我並不是很樂觀……但我實際上嘗試的第一個想法工作過。所以。
您只需將-vsync 2
選項與-r $maxfps
選項結合起來,當然您可以將其替換$maxfps
為您想要的最大幀速率!它有效!它不會複製來源檔案中的幀,但會丟棄導致檔案超過最大幀速率的幀!
預設情況下,它本身似乎-r $maxfps
只會導致它複製/丟棄幀以實現恆定的幀速率,並且-vsync 2
它本身會導致它直接拉入幀而不會真正影響 PTS 值。
我對此並不樂觀,因為我已經知道這-r $maxfps
會使其保持恆定的幀速率。老實說,我預期會出現錯誤,或只服從最先發生的或最後發生的任何一個。事實上,它完全符合我的要求,這讓我對 FFMPEG 開發人員非常滿意。
我希望這對您或以後不再需要知道這一點的其他人有所幫助。
答案2
我想指定一個具有最大值的可變幀速率,並允許 libx264 根據需要降低幀速率。這裡的想法是當存在諸如擴展靜止幀之類的情況時獲得額外的壓縮
根據我的理解,這可能以一種相對笨拙的方式實現,但由於一些複雜且違反直覺的原因,這是不可取的
儘管 x264 串流具有幀速率,但幀速率更多的是容器級問題,而不是編解碼器問題。
在直通 VFR 編碼中,本質上是一個文本文件,詳細說明了幀/時間的幀速率,並且在對源進行編碼時,諸如 tcfile-in 或 tcfile-out 之類的函數將時間戳傳遞給編碼,映射速率位置並保持視訊與來源的主觀一致性。
低幀率的想法是合乎邏輯的,但由於多種原因而行不通。儘管 x264 具有 VFR 感知能力並具有某些功能,但我認為沒有分析功能可以改變運動的幀速率以降低檔案大小(類似於許多比特率控制)。
來源也是一個問題:VFR 來源預設會保留其幀可變性,但顯然以可變比特率編碼 CFR 檔案(有時是個好主意,特別是在需要電視電影時)將簡單地產生相同的 CFR。
這意味著您可能必須手動重寫位元率(即混合到檔案中的慢速場景的時間戳記),或者訴諸於幀抽取演算法,例如 avisynth 的 dup、dedup 和 excitDedup。如果您的影片的運動量確實極低,則某些影格(甚至一半?)將被丟棄。問題在於這些演算法並不先進,並且無法對「現實生活」的鏡頭做出良好的選擇,以決定什麼將有助於最佳編碼。
此外,刪除包含 I 幀和 B 幀等內容的幀會隨著時間的推移減少可用的細節量,這會導致運動看起來“不穩定”,並可能幹擾其他基本視訊參數並導致鋸齒等偽影。
由於量化器的工作方式,x264 實際上會在這些低運動場景中進一步不成比例地降低位元率。除非您有相同影像的幻燈片,否則將會出現運動(如果只有顆粒和其他偽影),並且品質會有所下降,而如果不大幅改變位元率,則不會出現這種情況。
最後,沒有太多選項可以滿足您的要求,因為 x264 非常擅長僅使用時間壓縮(記錄部分幀中的變化)來管理位元率。達到 1/2 幀速率不會將檔案大小減半; 10% 可能是低速運動或動畫所期望的實際增益。
簡而言之,降低靜態場景的位元率對檔案大小影響不大,但會增加許多品質和同步問題,更不用說與影片編輯軟體的不相容了。
如果您確實想嘗試抽取器,您也許可以使用以下方法來限制最大新幀速率等級選項,其中每個種類都有最大解析度和幀速率。不幸的是,您可能必須使用配置文件以非常低的分辨率工作才能獲得您想要的幀速率。回到手動編輯速率,要么完全編輯速率,要么糾正您認為太高的幀速率。無論哪種方式,如果在儲存 tcfile 的編碼過程之後進行更改,則需要進行一些調整才能使聲音與新的幀速率保持同步。
結論是,花時間優化許多比特率設定將在檔案大小管理方面產生更多的效果,並提高視訊質量,而不是因為一點收穫而導致複雜化。保留原始 FPS 可能是最好的主意,除非您的目標是廣播或媒體標準。播放器經過精心設計,可以處理不同的位元率(與 NLE 不同),影片中的畫面越多,播放越流暢,並且由於幀之間的運動變化較小,檔案大小可能也越小。
以下是標準資訊和論壇討論的連結集合,這些連結應該有助於解決編碼的這個令人困惑的方面:
-fps 和 -r 開關
-x264 常規(tcfile、fps)
-時間碼檔案標準
-級別和配置文件
-簡短、清晰的 CFR/VFR 設定摘要(「幀速率」部分)
答案3
完美的解決方案:減少重複的非常相似的幀並以(峰值)可變幀速率保存輸出
- 對於具有長靜態場景的內容,刪除重複幀可以動態降低幀速率並顯著降低,以實現比編解碼器及其幀內壓縮所能實現的更多的檔案大小減小!
- 在我的例子中:
- 60 FPS 時 100% 原始夾層檔案大小
- 60 FPS 恆定幀速率下為 15% CR28
- 60 FPS 峰值幀速率時 CR28 為 6%(幾乎是 3 倍!)
原廠可用
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 screen-recording-vfr.mp4
將已壓縮的影片轉碼為動態幀速率,無需重新編碼
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated-without-reencoding.mp4
詳細
原廠可用
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 "screen-recording-vfr.mp4"
-i video-mezzanine.mov Original or your high quality rendered export as the input file.
-movflags faststart Streaming ready by putting the moov atom to the file start.
-c:v libx264 H-264 codec
-vf mpdecimate Drop frames not differing greatly from previous frame to reduce frame rate.
-vsync vfr Output as variable frame rate (vfr)! Necessary sister option to 'mpdecimate'.
- To maintain the playback speed while benefitting from the file size reduction.
-r 30 If you specify -r then in this combo it serves as the peak framerate!
I recommend to omit this option:
- Then the peak framerate IS the peak/constant rate of the source.
- Which preserves dynamic scenes fully and compresses long still sequences.
- So the best of both aspects.
- State a peak FPS if loosing FPS in dynamic scenes
is acceptable for the reduction in file size.
-crf 24 - Constant Rate Factor (constant quality at variable bitrate)
-preset veryslow - Quality effort put into the encoding
screen-recording-vfr.mp4 - Output file
將已匯出的影片轉換為動態幀速率,無需重新編碼
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated.mp4
這是無損操作。不會發生有損重新編碼,只會發生重新打包/重新引用。
它會丟棄盡可能多的重複幀!
例子:
僅 3 張靜態影像的幻燈片,無過渡 * 每張持續 5 秒 * 50 FPS = 750 幀
ffmpeg
確實會在 1/5 (=0.2) FPS 時將其減少到僅 3 幀!已與mediainfo確認!
分析與學習
- 具有長靜態影像場景的影片可以顯著減少幀數和檔案大小!
- 對於這兩種情況
- 以相同 CFR 的夾層檔案進行編碼可保持視覺質量
- 但從恆定幀速率到可變幀速率,檔案大小減少了 15% 到 6%。
- 不重新編碼而降低幀率帶來的檔案大小減少較少,但仍:
- 減少檔案大小(15% 至 10%)
- 以相同 CFR 的夾層檔案進行編碼可保持視覺質量
screen-recording.mov
- Frame rate mode: Variable
- Frame rate: 58.628 FPS
- Minimum frame rate: 30.000 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 732 100 %
- Size: 1675084 bytes 100 %
screen-recording CR24 fps 60.mp4
- Frame rate mode: Constant
- Frame rate: 60.000 FPS
- Frame count: 750 102 %
- Size: 255863 bytes 15 %
screen-recording CR24 mpdecimated vfr.mp4
- Frame rate mode: Variable
- Frame rate: 17.398 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 214 29 %
- Size: 101860 bytes 6 %
screen-recording CR24 mpdecimated fps 30 max.mp4
- Frame rate mode: Variable
- Frame rate: 11.078 FPS
- Minimum frame rate: 1.154 FPS
- Maximum frame rate: 30.000 FPS
- Frame count: 137 17 %
- Size: 94382 bytes 5.6
screen-recording CR24 mpdecimated vfr without re-encoding faststart.mp4
- Frame rate mode: Variable
- Frame rate: 19.974 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 247 33 %
- Size: 165 KB (164947 bytes) 10 %