VP9 位元率模式詳解

簡介

雖然我們在基本編碼頁面中提供位元率模式的整體詳細資料,但這些資料僅適用於 CQ (受限品質) 模式。

本文將詳細說明其他實用方法,讓您調整 VP9 位元率,以因應各種情況。以下範例使用 FFmpeg

壓縮

VP9 等影片壓縮技術旨在減少傳達可理解的圖片和動作感給使用者所需的資料量。

為此,我們採用的一項重要技術是量化。量化器會以數學方式簡化圖片的各種數位化元素。舉例來說,這項技術可能會減少使用的顏色範圍,並對資料執行數學函式,以「平滑化」在縮減的顏色範圍內,所感受到的細緻解析度不足。這類函式有很多。

維基百科文章中詳細說明瞭量化 (或「Q」)。

在 VP9 中,量化作業會在轉換係數上執行。藉由在編碼中加入資訊,降低維持感知品質所需的位元率。

最終,量化越多 (Q 數越高),細節就會遺失,畫質也會降低,但儲存影格所需的資料量較少。在大多數情況下,VP9 編碼器會根據每個影格的複雜度,隨時間變更 Q 值,以達到位元率目標。

最佳化使用案例

如要讓使用者根據特定需求「調整」VP9 壓縮,可透過多個程式設計介面,在初始壓縮時調整品質和位元率的平衡。

編碼器可在速度、品質和位元率之間進行取捨。

  • 如果使用者注重品質,就必須準備好花費較長的編碼時間,或是提供更快速且充足的處理資源。

  • 如果使用者著重於確保輸出 VP9 編碼檔案較小,且可快速傳送,就必須準備減少量化器可處理圖片的時間,這會導致量化器可運作的細節較少。

  • 如果使用者純粹注重傳輸速度 (例如在網路直播或雙向視訊會議中),則量化可能完全從屬於網路可傳輸可用資料位元組的速率限制 (即「位元率」)。

正確的選擇會因每個用途而異。為簡化調整程序,VP9 支援四種「位元率模式」,可直接設定以符合您的用途。

VP9 位元率模式

首先,我們先來看看 VP9 支援的主要位元率模式:

模式
常數量化器 (Q) 可指定固定量化器值,位元率會有所不同
受限品質 (CQ) 可設定最高畫質等級。位元率參數內的品質可能不一
可變位元率 (VBR) 在位元率限制內,隨著時間推移平衡品質和位元率
固定位元率 (CBR) 嘗試維持相當穩定的位元率,但畫質會有所變化

Q

Q 模式圖表

如果檔案大小和位元率完全不重要,只在乎最終品質,建議使用「固定量化器」模式。

Q 設定的用途包括數位電影、數位編輯套件或數位看板應用程式,這些用途的內容可透過實體儲存媒體或不受時間限制的方式傳送,且遠早於實際使用內容的時間,而所需的輸出內容必須具備最高視覺品質。

VP9 Q 模式位元率最佳化

常數量化器模式只需要最少的設定。顧名思義,Q 模式的重點在於將量化器維持在目標「品質」等級,並允許量化器決定要處理的資料流量。使用者只需要定義目標品質。

如要進一步瞭解目標品質的具體資訊,請參閱「基本編碼」一文,瞭解圖片處理重點 (而非位元率重點)。

如要使用 Q 模式位元率最佳化功能,請使用下列 FFmpeg 指令列參數:

ffmpeg
-b:v 0 將影片位元率標示為 0,即可明確設定「Q」模式
-g <arg> 以影格為單位設定主要畫面格間隔 (預設為 240)
-crf <arg> 設定最高品質等級。有效值介於 0 至 63 之間。數字越小,品質越高
-quality good -speed 0 這是大多數應用程式的預設建議設定。best 比較偏向研究工具,相較於 -quality good -speed 0,效能略有提升
-lossless 無損模式

Q 模式位元率:FFmpeg 範例

第一個範例是極端的 Q 模式設定,僅供說明。(即使處理這些範例中的 120 秒片段,也需要數小時,而且產生的輸出檔案通常比原始來源大得多)。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -crf 0 -quality good \
  -speed 0 -lossless 1 -c:a libvorbis Q_g_1_crf_0_120s_tears_of_steel_1080p.webm.webm

如要比較 -crf 的效果,下列範例只會變更 -crf。請注意,-g「並未」定義,因此會預設為 240,而實際上 -crf 會預設為 10,因此在三個範例的第二個中,即使不加入任一參數,結果也會相同:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 0 -quality good \
  -speed 0 -c:a libvorbis Q_crf_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -c:a libvorbis Q_crf_10_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 63 -quality good \
  -speed 0 -c:a libvorbis Q_crf_63_120s_tears_of_steel_1080p.webm

這些範例的輸出內容在磁碟上的大小有所不同。-crf 設為 0 時,檔案大小為 711.8 MB;-crf 設為 10 時,檔案大小為 125.3 MB;-crf 設為 63 時,檔案大小為 4.5 MB。簡單來說,這表示我們提高了 -crf 引數的值,導致產生的 VP9 編碼檔案品質降低。所有輸出檔案的完整摘要位於下方的「結果表」。

現在讓我們比較變更 -g 設定的效果。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 1 -b:v 0 -quality good \
  -speed 0  -c:a libvorbis Q_g_1_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 240 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_240_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -g 480 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm

我們發現 -g 1 設定會產生非常大的檔案,大小為 25.9 MB。 請與變更 -g 240 (明確設定與預設值相同的值) 進行比較,我們會得到 4.5 MB 的檔案,而 -g 480 則會得到 4.4 MB 的檔案。

CQ

CQ 是以檔案為基礎的影片建議模式。

CQ 模式圖表

對於大多數內容類型,我們建議使用受限品質 (CQ) 模式,並設定位元率上限。大多數影片會混合呈現高動作場景 (例如動作序列) 和細節較少的場景 (例如對話)。CQ 模式可讓編碼器在較長且較簡單的場景中維持合理的品質水準 (不會浪費位元),同時為困難的序列分配更多位元。

不過,我們仍須提供上限範圍來限制程序,否則可能完全不會壓縮!我們也可以設定較低的範圍,即使圖片是黑色,編碼程序幾乎沒有任何作用,我們仍會傳輸資料,效率可能不如預期,但最終結果是即使是黑色也不會大幅壓縮,看起來「非常黑」。

此外,我們也必須設定量化器門檻。在 VP9 中,量化器閾值可從 0 降至 63

下列 FFmpeg 指令列參數用於 CQ 模式:
ffmpeg
-b:v <arg> 設定目標位元率 (例如 500k)
-minrate <arg>
-maxrate <arg>
設定最小和最大位元率。
-crf <arg> 設定最高品質等級。有效值為 063,數字越小代表品質越高。
CQ 位元率模式:FFmpeg 範例

第一個範例提供相當寬鬆的限制。不過,與上述 Q 的範例相比,我們發現這會將位元率強制調高,輸出品質也明顯較高。檔案大小明顯變大。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1000k -maxrate 4000k -crf 10  -c:a libvorbis \
  CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm

在這個例子中,磁碟上的輸出檔案為 20.2 MB,明顯小於上述範例中的 Q 模式編碼。

相較之下,下一個範例將位元率限制在更明確的範圍內。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10  -c:a libvorbis \
  CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm

在這個例子中,輸出檔案大小為 24.1 MB,與上一個例子相比,在複雜度和動作較高的情況下,影片畫質明顯降低。

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm

在這個最終範例中,輸出內容的大小大幅縮減,磁碟上的大小降至 13.2 MB。

VBR

建議對高動作內容 (例如運動) 的隨選影片檔案使用可變位元率模式 (VBR)。非常適合以 HTTP 為基礎的傳送方式。

VBR 模式圖表

在 VBR 模式中,動作場景的編碼位元率可能會高於「較簡單」的場景,這與關鍵影格一致。

對於大型串流傳輸模型,VBR 的優點在發行和基礎架構方面都相當顯著。如果同一基礎架構提供許多 VBR 串流,使用該系統的所有觀眾都能受益。

此外,也建議使用 VP9 VBR 編碼運動和其他動作激烈的內容。對於這類高複雜度內容,VBR 可在動作較少的期間達到較高的品質。

VBR 模式會使用下列 FFmpeg 指令列參數:
ffmpeg
-quality good good 品質適合隨選影片
-speed <arg> 如果是 VIDEO ON DEMAND,有效值為 0 到 5,其中 0 代表最高畫質,5 代表最低畫質。(直播的範圍為 5 到 9,請參閱下方的 CBR)
VBR 位元率模式:FFmpeg 範例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 0  -c:a libvorbis \
  VBR_good_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm

CBR

建議使用固定位元率模式 (CBR) 進行 VP9 直播。

CBR 模式圖表

CBR 基本上會將上限位元率設為「硬性上限」。也就是說,編碼程序產生的資料量不得超過網路可承載的量。

舉例來說,對於即時通訊 (視訊會議) 串流,編碼應用程式傳送的資料量不應超過網路可承載的量,這點非常重要。如果會,音訊/影像同步問題或畫面凍結會大幅影響使用者體驗,影響程度甚至大於壓縮效率降低。確保定義硬性上限後,VP9 會在達到上限時降低畫質。

下列 FFmpeg 指令列參數用於 CBR 模式:
ffmpeg
-quality realtime realtime 畫質適合直播
-speed <arg> 直播的有效值為 5 到 9,5 代表最高畫質,9 則代表最低畫質。(如果是隨選影片,這些值為 0 到 5。請參閱上方的 VBR)。
-minrate <arg>
-maxrate <arg>
設定最小和最大位元率 ** 必須為 CBR 模式設定相同的 -b:v 位元率值**。

簡單來說,我們將目標、最低和最高位元率設為相同值,並告知量化器作業對時間很敏感。

CBR 位元率模式:FFmpeg 範例

以下範例說明如何將位元率設為 2 Mbps 和 500 kbps 目標:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 8 -c:a libvorbis \
  CBR_2000_realtime__8_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm

結果

上述每項編碼作業都是在 Ubuntu Linux 系統上執行,規格如下:

  • 處理器:4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • 記憶體 (RAM):8060MB (已使用 1492MB)
  • 顯示卡:Intel HD Graphics 530 (Skylake GT2)
  • 作業系統:Ubuntu 16.04 LTS

在所有情況下,來源檔案都是從《鋼鐵之淚》擷取的一分二十秒 (1:20) 片段

檔案 編碼分鐘數 磁碟上的檔案大小
Q_g_1_crf_0_120s_tears_of_steel_1080p.webm 81 1.06GB
Q_crf_0_120s_tears_of_steel_1080p.webm 131 711.8MB
Q_crf_10_120s_tears_of_steel_1080p.webm 118 125.3MB
Q_crf_63_120s_tears_of_steel_1080p.webm 27 4.5MB
Q_g_1_120s_tears_of_steel_1080p.webm 51 25.9MB
Q_g_240_120s_tears_of_steel_1080p.webm 28 4.5MB
Q_g_480_120s_tears_of_steel_1080p.webm 10 4.4MB
CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm 11 20.2MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm 50 13.2MB
VBR_good_0_120s_tears_of_steel_1080p.webm 3 23.4MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 2 24.8MB
CBR_2000_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 21MB
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 8.5MB
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 7.1MB

明顯可見的是,將 -speed 值設為高於 5 會轉換 VP9 處理速度。雖然量化程度大幅提升 (在極低品質的快速位元率下,可看到強烈的「抖動」效果),但 VP9 仍能產生非常優異的低位元率 1080p 輸出內容,只是相較於大型螢幕,更適合用於小型行動裝置。

重新調整大小的用途注意事項

VP9 的位元率模式顯然並非獨立,可與許多其他引數和參數合併,以鎖定特定用途。其中一個常見用途是重新調整輸出影片的尺寸,以鎖定特定裝置。

舉例來說,將 HD 串流變更為 SD 輸出就是這種情況。同樣地,這會對處理時間和輸出位元率造成重大影響。在兩個 FFmpeg 指令完全相同的案例中,只要調整輸出影片的大小,就會改變產生的檔案大小,以及串流模型中的位元率。

為說明這點,我們從每個位元率模式中各取一個中點範例,並簡單新增重新調整比例的參數。

Q 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -vf scale=640x480 -c:a libvorbis 640x480_Q_crf_10_120s_tears_of_steel_1080p.webm
CQ 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

重新調整比例的結果表

檔案 編碼分鐘數 磁碟上的檔案大小
640x480_Q_crf_10_120s_tears_of_steel_1080p.webm 5 3.4MB
640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm 2 22.4MB
640x480_VBR_good_5_120s_tears_of_steel_1080p.webm 1 22.6MB
640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm 4 23MB

為方便比較,這些 FFmpeg 指令與先前的範例相同,但沒有縮放功能:

檔案 編碼分鐘數 磁碟上的檔案大小
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24.1MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23.9MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 24.8MB

如您所見,每種模式的輸出檔案大小都明顯縮減,且大多數範例的編碼時間也縮短,但 Q 模式的編碼時間實際上會增加。「更」壓縮影片需要更多時間,因此即使輸出檔案預期會較小 (如果品質不受限制,如 Q 模式),實際產生輸出檔案的時間可能會增加。請勿以為編碼程序一定能更快傳送較小的檔案。

重新調整降低位元率

最後,我們將重新執行 CQ、VBR 和 CBR 重新縮放範例,但這次將目標位元率限制為 500 kbps,大約是四分之一 (與圖片大小縮減幅度一致)。

CQ 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 550k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
VBR 模式
ffmpeg -i "120s_tears_of_steel_1080p.webm" -c:v libvpx-vp9 -b:v 500k \
  -minrate 350k -maxrate 500k -quality good -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

重新調整大小和降低目標位元率的結果表

檔案 編碼分鐘數 磁碟上的檔案大小
640x480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7MB
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7MB
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7.6MB

如您所見,編碼時間進一步縮短。