VP9 位元率詳細資訊
引言
雖然我們在「基本編碼」網頁中提供了有關位元率模式的高層細節,但目前還是能處理 CQ (壓縮品質) 模式。
本文件詳細說明其他可自訂 VP9 位元率的做法,以便針對各種情況進行最佳化。以下範例使用 FFmpeg。
壓縮
影片壓縮技術 (如 VP9) 旨在減少所需資料,以向使用者提供可理解的動態相片和動態效果。
量化為此的關鍵技術之一,就是量化。量化器能夠簡化圖片的各種數位化元素。例如,它可能會減少使用的顏色範圍,並進一步對資料執行數學函式,使其「流暢無縫」(感知的色彩解析度較小)。這類函式有許多種。
數量化 (或稱「Q」) 是維基百科的相關文章。
在 VP9 中,對轉換係數執行量化。這麼做可以藉由新增編碼的方式,降低維持感知品質所需的位元率。
最後,當量化越多 (Q 數字越高),詳細資料就會遺失且品質較低,但儲存畫面所需的資料較少。在大多數情況下,VP9 編碼器會隨時間改變 Q 來達成位元率目標,具體情況取決於每個影格的複雜度。
用途最佳化
為了讓使用者「微調」特定 PV9 壓縮可滿足其特定需求,您可以透過一些程式設計介面調整初始壓縮時的品質和位元率的平衡。
編碼器在速度、品質和位元率之間有明顯的平衡。
如果使用者著重品質,就必須準備較長的時間,或提供更加快速且優質的處理資源。
如果使用者著重確保輸出的 PP9 編碼檔案很小且可以快速傳送,則必須準備為量化器處理圖片所需的時間,這會導致量化器的工作量較低。
如果使用者只專注於傳送速度 (例如,在網路直播或雙向視訊會議中),量化就可能完全受限於網路可用資料位元組數的速率 (即 bitrate")。
針對各種用途,正確的選項都相當明確。為了方便您根據個人用途調整這筆餘額,VP9 支援四種「位元率模式」的簡單設定。
VP9 位元率模式
我們先來看看 VP9 支援的主要位元率模式:
模式 | |
---|---|
常數量化器 (Q) | 這項設定可讓您指定固定的量化值;位元率不同, |
受限品質 (CQ) | 可讓您設定最高品質等級。畫質可能因位元率參數而異 |
可變位元率 (VBR) | 在位元率的限制下,品質和位元率的平衡 |
常數位元率 (CBR) | 企圖讓位元率保持穩定,同時確保品質不一 |
問
在處理檔案大小與位元率時,對於最終品質有直接影響的情境時,常數量化器模式是不錯的選擇。
數位電影應用實例、數位編輯套件或數位電子看板應用程式都有適用的 Q 設定用途,其中內容可在實體儲存媒介或不受限制的時限內提交;在實際使用內容之前,以及所需輸出必須是最高視覺品質。
VP9 Q 模式位元率最佳化
常數 Quantizer 模式需要最少的設定。顧名思義,Q 模式著重於將量化器維持在目標「品質」等級,允許量化器決定需要處理的資料流程。使用者需要定義的內容就是目標品質。
請參閱基本編碼一文,進一步瞭解圖片處理焦點 (而非位元率焦點) 的目標品質詳細資訊。
請使用以下 FFmpeg 指令列參數進行 Q 模式位元率最佳化:
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 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 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 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 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.3MB,而 -crf
設為 63
則為 4.5MB。簡單來說,這種做法主要透過提高 -crf
引數的值,降低產生的 VP9 編碼檔案的品質。以下提供所有輸出檔案的完整摘要。
現在我們來比較不同-g
設定的影響。
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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.5MB 檔案;而 -g 480
最後則是 4.4MB 檔案。
單次安裝出價
CQ 是檔案型影片的建議模式。
對於大部分的內容類型,我們建議使用受限制的品質 (CQ) 模式和位元率上限。大部分影片都含有高度動機的場景 (例如動作序列),以及細節較少的場景 (例如對話)。CQ 模式可讓編碼器在較長、較容易的場景 (不含點陣圖) 中維持合理的品質等級,同時為困難序列分配更多位元。
儘管如此,我們仍需要提供上限範圍來限制處理程序,否則甚至可能沒有任何壓縮!我們還可以設定「較低的範圍」,即使圖片是黑色且編碼程序幾乎沒有任何作用,我們仍會處理該資料,但效率可能不如預期,但最終結果甚至不會造成嚴重壓縮,看起來像是「非常黑色」。
此外,我們也必須設定量子門檻。在 VP9 中,量化門檻值可能從 0
到 63
。
下列 FFmpeg 指令列參數用於 CQ 模式:
ffmpeg | |
---|---|
-b:v <arg> |
設定目標位元率 (例如 500k) |
-minrate <arg> -maxrate <arg> |
設定最小和最大位元率。 |
-crf <arg> |
設定最高品質等級。有效值為 0 到 63 ,數字越小則代表品質越高。 |
CQ 位元率模式:FFmpeg 範例
第一個範例提供相當寬鬆的限制條件。然而,與上文為 Q 提供的範例相比,我們發現,位元率會讓位元率變高,且輸出品質明顯明顯。檔案大小明顯大一點
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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.1MB,與之前的例子相比,在高複雜度和動態情況下,影片畫質明顯降低。
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 1000k \
-minrate 750k -maxrate 1400k -crf 10 -c:a libvorbis \
CQ_1400_750_crf_10_120s_tears_of_steel_1080pp.webm
在最後的範例中,輸出結果的大小大幅縮減,磁碟上的大小下降為 13.2 MB。
VBR
如要串流播放高動態型內容 (例如體育) 的隨選影片檔案,建議使用可變位元率模式 (VBR)。它非常適合以 HTTP 為基礎的放送。
在 VBR 模型中,動作場景的編碼可能會比「更簡易」場景更高,也就是與主要畫面格一致的編碼。
以大型的串流傳送模型來說,VBR 的優點在發布和基礎架構條款中皆會大幅增加。當同一個基礎架構提供多個 VBR 串流時,可為使用系統的所有觀眾帶來好處。
我們也建議 VP9 VBR 對運動和其他具有高度動機的內容進行編碼。對於這類高複雜內容而言,VBR 在較低動作期間會達到較高品質的品質。
下列 FFmpeg 指令列參數用於 VBR 模式:
ffmpeg | |
---|---|
-quality good |
若使用這個屬性,FFmpeg 會考量後續的 -speed 設定。 |
-speed <arg> |
對於 VIDEO ON DEMAND 有效值為 0-4,其中 0 是最高數量,4 是最低的。(直播範圍為 5-8,請參閱下面的 CBR) |
VBR 位元率模式:FFmpeg 範例
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9 -b:v 2000k \
-minrate 1500k -maxrate 2500k -quality good -speed 5 -c:a libvorbis \
VBR_good_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 2000k \
-minrate 1500k -maxrate 2500k -quality good -speed 8 -c:a libvorbis \
VBR_good_8_120s_tears_of_steel_1080pp.webm
CBR
建議使用 VP9 的即時串流使用位元率位元率 (CBR)。
CBR 基本上會將高位元率設為「硬性天花板」。這表示編碼程序無法以網路無法傳輸的速度產生資料。
例如,對於即時通訊 (視訊會議) 串流而言,編碼應用程式不會充斥網路無法傳輸的資料。如果是的話,音訊/視訊同步問題或凍結畫面對於使用者體驗有重大影響,比起壓縮效率更低,確保已定義硬式天花板,VP9 會在到達天花板時降低畫質。
下列 FFmpeg 指令列參數用於 CBR 模式:
ffmpeg | |
---|---|
-quality realtime |
若使用這個屬性,FFmpeg 會考量後續的 -speed 設定。 |
-speed <arg> |
直播的有效值是 5 到 8,其中 5 代表最高品質,8 是最低品質。(如果是隨選影片,這個值必須介於 0 到 4 之間。請參閱上方的 VBR)。 |
-minrate <arg> -maxrate <arg> |
設定最小和最大位元率 ** 必須將其設為 CBR 模式的相同 -b:v 位元率**。 |
用簡單來說,我們會把目標、最小和最大位元率以相同的值修正,並指示量化器對作業具有時效性。
CBR 位元率模式:FFmpeg 範例
下列範例說明如何將位元率設為 2Mbps 和 500kbps 的目標:
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 2000k \
-minrate 2000k -maxrate 2000k -quality realtime -speed 0 -c:a libvorbis \
CBR_2000_realtime_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 2000k \
-minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 vp9 -b:v 500k \
-minrate 500k -maxrate 500k -quality realtime -speed 0 -c:a libvorbis \
CBR_500_realtime__0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 500k \
-minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
CBR_500_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 500k \
-minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
CBR_500_realtime_8_120s_tears_of_steel_1080p.webm
結果
上述每個編碼均在具有下列規格的 Ubuntu Linux 系統上執行:
- 處理器:4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
- 記憶體 (RAM):8060MB (已使用 1492 MB)
- 顯示卡:Intel HD Graphics 530 (Skylake GT2)
- 作業系統:Ubuntu 16.04 LTS
在所有情況下,來源檔案都是 1 分鐘 20 秒 (1:20) 的片段從鋼珠。
請特別注意,將 -speed
值設為 5
會改變 VP9 的處理速度。雖然量化可大幅提升 (以極低的「快速」效果為準),但 VP9 仍能產生極低的低 1080p 輸出,雖然適合行動裝置螢幕較小,因此更適合採用小型螢幕。
重新調整大小的使用案例注意事項 (重新調整大小)
VP9 的位元率模式明顯未獨立,可與許多其他引數和參數結合使用,以指定用途。常見的用途之一可能是重新調整輸出影片的尺寸,以鎖定特定裝置。
常見的示例是將 HD 高畫質串流變更為 SD 輸出。這將大幅影響處理時間和輸出位元率。在兩個 FFmpeg 指令有相同情況的情境中,僅調整輸出影片的大小會改變產生的檔案大小,並確實在串流模型中使用位元率。
為了舉例說明,我們從每個位元率模式取得一個中點範例,並且加入了重新調整大小的參數。
Q 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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 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 的重新調整大小範例,但這次我們將目標位元率限制為 500kbps 的等級,大約為四分之一 (與圖片的縮小比例相同)。
CQ 模式
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v 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 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 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
用於調整規模和縮減目標位元率的結果表格
如您所見,編碼時間已進一步縮短。