FFmpeg H.264編碼器指南[譯]

H264 視頻編碼器指南

本指引着眼於x264編碼器,這裏假設你的FFmpeg 編譯了--enable-libx264支持。如果你需要編譯支持的幫助請看這篇文檔:https://trac.ffmpeg.org/wiki/CompilationGuide,看 HWAccelIntro關於支持H264編碼器在邏輯上的支持;

有兩種適用於大部分場景的碼率控制模式

Constant Rate Factor (CRF) : 恆定碼率因子模式

Two-Pass ABR: 兩遍式控制模式

碼率控制是指每幀需要處理多少bits的數據。碼率控制會決定視頻文件的大小和質量的優劣。需要更多關於碼率控制模式的區別,請看這篇文章

CRF-- 恆定碼率因子模式

推薦在你需要保證視頻的質量最佳,而完全不關心視頻文件的大小的時候使用這種模式;

這種模式運行編碼器當在不關心輸出文件的大小時,得到一個一定質量的視頻;這種方式可以讓一次處理達到一個最大的壓縮效果。也可以通過調整每幀所謂的量化因子,可以得到所需的比特率去保證要求的視頻質量等級;不過缺點就是你不能指定輸出文件的大小或者限制視頻不能超過某個大小閾值,也就是說這種方式不推薦用到流式的視頻編碼。

1、設置CRF的值

CRF的取值範圍是0-51,0是畫面質量最高的無損(只是針對8bit,10bit的話要用 -qp 0),默認值是23,51的話是畫質最差的。值越低,質量越高(可以理解爲畫面質量的損失值),主管的認爲合理的值範圍是17-28。

17或者18是肉眼區別不出來的無損或者幾乎區分不出來的無損;這時看起來跟輸入一樣或者非常接近,但技術來說並不是無損的。

CRF的取值範圍對畫質的影響是指數級別的,所以,參數值+6的結果差不多隻有原數值比特率/文件大小的一半。同樣,參數值-6會導致大概比特率/文件大小是原來的兩倍。

在視頻質量可以接受的範圍選擇一個CRF最大的值。 如果輸出畫質依舊非常好,再選大一點,如果畫質不行,再調小;

注意:0-51 的CRF取值範圍僅適用於8-bit 的x264. 如果你編譯了10bit的x264,CRF的取值範圍是 0-63,(在x264的源碼上,它是-12到51,只不過是 FFmpeg的 libx264給包裝了一層,做了偏移處理。所以0依舊是無損的,但只在受支持的配置文件中,High 10 不支持無損)。
你可以通過FFmpeg編碼處理的控制檯輸出判斷你究竟在用哪種(yuv420p就是8-bit的,yuv420p10le就是10-bit的)。8-bit更常用;

2、選擇一個預設值和Tune;

preset--預設值

譯者:--preset的參數主要調節編碼速度和質量的平衡

預設值是一系列保證確定的編碼速度和壓縮率的選項值的集合。慢的預設值能提供更好的壓縮效率(也就是文件能壓縮得更小)。例如,如果你設定了確定的文件大小或者固定的比特率,你能用更慢的預設值得到更好的質量。同樣的,對於固定的質量編碼,你能通過選擇較慢的預設值到簡單保存比特率;

選在你耐心範圍內最慢的預設值。所有的預設值由慢到快的速度排序如下:

  • ultrafast (很快,但文件很大 幾乎沒怎麼壓縮)
  • superfast
  • veryfast
  • faster
  • fast
  • medium – 默認預設值
  • slow
  • slower
  • veryslow (很慢,但壓縮率很高 文件很小)
  • placebo – 忽略這個,這個沒啥用 (參考 FAQ)

你可以通過參數:-preset help看到當前的所有預設值。如你安裝了x264的庫,你也可以用x264 --fullhelp 查看完整的預設設置;

Tune

譯者:--tune的參數主要配合視頻類型和視覺優化的參數。

你可以用-tune參數去改變你指定的輸入的設置,當前的turn有如下值:

  • film – 適用於高質量的電影,降低去塊效應。use for high quality movie content; lowers deblocking
  • animation – 適用於動畫,使用更高級的去塊處理和更多的參考幀。 good for cartoons; uses higher deblocking and more reference frames
  • grain – 保留舊的、顆粒狀的影片材料中的顆粒結構。 preserves the grain structure in old, grainy film material
  • stillimage – 適用於幻燈片式的內容。good for slideshow-like content
  • fastdecode – 通過關掉某些路徑,實現更快的編碼。allows faster decoding by disabling certain filters
  • zerolatency – 適用於快的編碼和低延遲的流。 good for fast encoding and low-latency streaming
  • psnr – 忽略此項,編碼器開發用的。ignore this as it is only used for codec development
  • ssim – 忽略此項,編碼器開發用的。ignore this as it is only used for codec development

例如,如果你的輸入是一個動畫你可以用animation,或者你你保留顆粒狀在影片裏你可以用grain選項。如果你不確定你要用那個選項或者不知道你的輸入適用何選項你可以忽略 -tune 選項。你可以用 -tune help查看所用的tune選項列表,或者用 x264 --fullhelp看這些選項設置的含義。

Profile(配置文件)

譯者:限制輸出文件的profile。這個參數將覆蓋其它所有值,此選項能保證輸出profile兼容的視頻流。如果使用了這個選項,將不能進行無損壓縮(qp 0 or crf 0)。

一般不建議設置;

-profile:v 參數將輸出限定爲特定的H264配置。一般來說你不想理用這個選項,建議忽略這個設置h264會自動選擇合適的配置文件;

某些設備(一般是老掉牙的)只支持更多限制的Constrained BaselineMain profiles。你可以設置這些選項值爲 -profile:v baseline or -profile:v main. 新設備一般都支持更高級的 High配置文件。

另外要用這個參數的原因是,要去匹配其他用 concat demuxer連接的視頻文件。

注意:-profile:v參數不兼容無損的編碼,setting -profile:v high444 也是無效的。

x264支持的配置文件如下:

  • baseline
  • main
  • high
  • high10 (first 10 bit compatible profile)
  • high422 (支持yuv420p, yuv422p, yuv420p10le and yuv422p10le)
  • high444 (supports as above as well as yuv444p and yuv444p10le)

列出預算和tunes

用以下命令列出當前的預算和tunes:

ffmpeg -hide_banner -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 -

注意: windows環境要改爲:

ffmpeg -hide_banner -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 NUL

CRF 示例

下面命令用更慢的預設值與更好的壓縮,將視頻重新編碼爲質量好的視頻。

ffmpeg -i input -c:v libx264 -preset slow -crf 22 -c:a copy output.mkv

注意,這條示例直接用簡單拷貝的方式將輸入的音頻流拷貝到輸出而沒有重新編碼;

如果你要處理一批相似的視頻,用統一的設置,能保證這樣這批視頻的輸出質量都接近;

譯者:這裏的-preset控制的是壓縮率和編碼速度的,-crf控制輸出質量的。

Two-Pass--兩遍式

如果你要輸出指定大小的文件,並且輸出質量和每幀的質量要求沒那麼高的時候, 那就用這種碼率控制模式。這是用示例最好的解釋。你的視頻時長600秒並且需要輸出大小是200MB。根據:bitrate = file size / duration:

(200 MB * 8388.608 [轉換MB到KBit(1024*8/1000); 注意不是8192,因爲1KBit是1000bit。]) / 600 seconds = ~2796 kBit/s 總比特率

2796 - 128 kBit/s (減去音頻比特率) = 2668 kBit/s 是視頻的比特率

你也可以忽略什麼的計算公式如果你已經知道最終的模板比特率的話。

譯者:通過上面的公式,你就能得到一個最終輸出文件大小確定的視頻;

兩遍式示例

對應兩遍式,你要用差不多一樣參數跑兩次,參數不同點如下:

  • 在第一遍和第二遍,用 -pass 1-pass 2 選項區別;
  • 在第一遍,輸出是一個空描述,沒有一個顯式的輸出(但會生成一個日誌文件ffmpeg在第二遍需要用);
  • 在第一遍,你可以用-an參數剝離音頻文件;

注意:第一遍,當用-an參數可能最終得到報段內存錯誤或者順壞的文件。這樣的話,去掉-an參數改爲-vsync cfr就行;

例如:

ffmpeg -y -i input -c:v libx264 -b:v 2600k -pass 1 -an -f null /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

windows下空輸出“/dev/null”要改成“NUL”,‘\’ 要改成'`';

跟CRF一樣,可用可以接受的-preset-tune-profile:v參數以得到不同的目標視頻;

無損的H.264

如果設置了-profile:v high444參數你可以用 -crf 0 生成無損的視頻,否則用 -pb 0(High 10 profile 配置不支持無損視頻, 詳看 https://code.videolan.org/videolan/x264/-/blob/master/x264.c#L579)。 ultrafastveryslow 這兩個預設值是非常常用的,因爲更快的編碼速度和更好的壓縮一般來說都是挺重要的考慮因素。

更快的編碼示例:

ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv

更好的壓縮效果示例:

ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 output.mkv

提示:無損的視頻文件一般來說都非常大,不是基於ffmpeg的播放器可能不能解碼播放。所以,如果兼容性和文件大小問題不可忽略,就別用無損了。

提示:如果你要的視頻是“視覺上無損”而不是技術上的無損的話,用-crf 17或者18就行(你自己試哪個數值可以接受)。這樣不會像真正的無損模式一樣搞出一個非常大和兼容性有問題的視頻文件;

覆蓋默認預設設置

雖然 -preset 已經預設好了可能是最優默認設置給你,但你還是可以用 x264-params 參數去覆蓋默認設置,也可以用libx264 的私有參數(ffmpeg -h encoder=libx264)。當然這些參數不推薦初學者使用。預設值是ffmpeg開發人人給出的最優解你去調這些參數一般都是浪費時間。

示例:

ffmpeg -i input -c:v libx264 -preset slow -crf 22 -x264-params keyint=123:min-keyint=20 -c:a copy output.mkv

注意: 不要用‘x264opts’這個參數, 這個參數後續版本會被刪的。用’x264-params‘就行;

【原文】

https://trac.ffmpeg.org/wiki/Encode/H.264

測試示例命令

crf輸出示例

#修改編碼速度與壓縮率
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast  ultrafast.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow  veryslow.mp4

#加入crf,速度快
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 18  ultrafast_18.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 23  ultrafast_23.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 51  ultrafast_51.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 39  ultrafast_39.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 45  ultrafast_45.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -crf 0  ultrafast_0.mp4

#加入crf,壓縮率高
ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -crf 18  veryslow_18.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -crf 23  veryslow_23.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -crf 51  veryslow_51.mp4
ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -crf 0  veryslow_0.mp4

兩遍式示例

ffmpeg -y -i input.mp4 -c:v libx264 -b:v 2097k -pass 1 -an -f null NUL  && ffmpeg -i input.mp4 -c:v libx264 -b:v 2097k -pass 2 -c:a aac -b:a 128k tow_pass_3MB_2097k.mp4

[參考]

https://ffmpeg.0voice.com/forum.php?mod=viewthread&tid=282

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