目的

本節提供執行檔案式編碼 (即非直播) 時的 VP9 編碼設定建議。

這些最佳化建議旨在達成下列目標:

  • 在品質和編碼速度之間取得平衡
  • 達到合理品質的最低位元率
  • 可因應各種內容類型調整設定

這些建議不會:

  • 解決直播編碼問題
  • 針對特定內容類型 (例如高動作量的運動賽事影片) 進行最佳化
  • 根據特定裝置或網路需求調整設定

單一解析度編碼

VP9 支援各種影格大小,從極小的解析度到 4K 皆可。較大的影格大小可提供較高的品質,但需要更多頻寬才能傳送,解碼時也需要更多處理能力。

如果您要建立單一解析度,640x480 是適用於各種網頁和行動裝置的保險選擇。您可以使用下列 FFmpeg 指令列參數,以 750 kbps 建立單一解析度的檔案。

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

多重解析度編碼

如果您打算指定多種解析度,或傳送網路的頻寬不同,建議建立多種解析度。播放器隨後就能控制傳送給觀眾的解析度。

多種解析度的影片編碼通常用於自適應位元率串流,影片播放器會根據使用者的頻寬,即時切換解析度。舉例來說,Shaka Player 可讓您播放多重解析度編碼,其中每個 VP9 編碼都位於個別檔案中,而 DASH 資訊清單則提供每個編碼的相關資訊。

如要進一步瞭解如何以自適應串流格式封裝影片,請參閱 Shaka Packager。本指南將著重於多種解析度的 VP9 編碼設定。

以下所有設定都可套用至各種解析度的個別檔案,合併使用即可提供適用於自適應串流的完整設定。請注意,640x480 版本有兩種版本,分別是低畫質 (LQ) 和中畫質 (MQ)。

位元率

為隨選觀看內容編碼 VP9 檔案時,建議使用受限畫質 (CQ) 模式。這個編碼模式可讓您指定目標平均位元率,同時控制影片最高畫質,以及最低和最高位元率。

建議您將下列位元率做為網頁和行動裝置發布的基準。這些建議會盡量降低位元率,同時確保影片品質適合在網路和行動裝置上發布,可視為「低」位元率建議,但仍能達到合理的品質。

以上述範例來說,建議將最低位元率設為目標位元率的 50%,最高位元率則設為目標位元率的 145%。

影格大小/影格率 目標位元率 (隨選視訊,kbps) 最低位元率 (50%) 最高位元率 (145%)
320x240p @ 24、25、30 150 75 218
640x360p @ 24、25、30 276 138 400
640x480p @ 24、25、30 512 (LQ)、750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p @ 24、25、30 1024 512 1485
1280x720p @ 50、60 1800 900 2610
1920x1080p @ 24、25、30 1800 900 2610
1920x1080p @ 50、60 3000 1500 4350
2560x1440p @ 24、25、30 6000 3000 8700
2560x1440p @ 50、60 9000 4500 13050
3840x2160p @ 24、25、30 12000 6000 17400
3840x2160p @ 50,60 18000 9000 26100

圖 2a:建議的隨選影片位元率

在 FFmpeg 中,位元率是由下列指令控管:

FFmpeg
-b:v <arg> 設定位元率 (例如 500k)
-minrate <arg>
-maxrate <arg>
設定最小和最大位元率。

舉例來說,編碼 640x480 內容時,您可以使用指令列 -b:v 750k -minrate 375 -maxrate 1088

品質

在 CQ 模式中,您也會設定最高品質等級。建議使用下列品質等級,以檔案為基礎進行 VP9 編碼:

畫格高度 目標品質 (CQ)
240 37
360 36
480 34 (LQ) 或 33 (MQ)
720 32
1080 31
1440 24
2160 15

在 FFmpeg 中,品質是透過 -crf 指令設定。舉例來說,如要將品質設為 33,請使用 -crf 33 指令

多重編碼和編碼速度

檔案編碼可讓您彈性調整速度。你也可以對同一素材進行多次掃描,以提高品質,並為每次掃描選擇速度。

在 FFmpeg 中編碼 VP9 檔案時,建議將 -quality 參數設為 good,然後根據下表,使用 -speed 參數設定第一和第二遍的速度。這樣可兼顧編碼時間和輸出品質。

畫格高度 速度 (首次掃描) 速度 (第二次傳送)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

舉例來說,FFmpeg 中的第一遍編碼字串可能包含 -quality good -speed 4

主要畫面格間隔

建議在影格之間最多允許 240 個影格 (30 fps 內容為 8 秒)。關鍵影格是自給自足的影片影格,不需依賴任何其他影格即可算繪,但往往比其他影格類型大。在網頁和行動裝置上播放時,主要畫面格之間間隔越大,編碼器就越能選擇最佳的主要畫面格位置,盡可能提高畫質。

在 FFmpeg 中,主要畫面格間距由 -g 指令控制,表示影格數量。如果是 240 個影格,則為 -g 240

分塊和執行緒建議

分格會將影片影格分割成多個欄,雖然畫質會稍微降低,但編碼效能會提升。動態磚的寬度必須至少為 256 像素,因此可使用的動態磚數量有限。

視圖塊數量和輸出影格的解析度而定,更多 CPU 執行緒可能會有幫助。一般來說,如果輸出畫面大小非常小,多個執行緒的價值有限。

建議您在各種解析度下使用下列設定,進行分塊和執行緒作業。

車架尺寸 圖塊欄數 執行緒數量
320x240 1 (-tile-columns 0) 1
640x360 2 (-tile-columns 1) 2
640x480 2 (-tile-columns 1) 2
1280x720 4 (-tile-columns 2) 4
1920x1080 4 (-tile-columns 2) 4
2560x1440 8 (-tile-columns 3) 8
3840x2160 8 (-tile-columns 3) 8

在 FFmpeg 中,圖塊數量由 -tile-columns 參數控制,執行緒數量則由 -threads 控制。舉例來說,640x480 編碼會使用 -tile-columns 1 -threads 2 指令列。

FFmpeg 指令列

綜合上述建議,您可以使用下列 FFmpeg 指令編碼 VP9 內容。

請注意,第一遍和第二遍指令會串連在一起。第二階段指令中的 -y 引數會在 FFmpeg 要求以輸出影片覆寫第一階段統計資料檔案時,回答「Yes」。

另請注意,針對最高 1280x720 的輸出內容進行編碼時,系統會使用 1080p 來源。輸出內容較大時,系統會使用 4K 來源。

320x240 (每秒 24、25 或 30 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640x360 (每秒 24、25 或 30 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x360.webm

640x480 (低畫質,每秒 24、25 或 30 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-low.webm

640x480 (中等畫質,每秒 24、25 或 30 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-medium.webm

1280x720 (每秒 24、25 或 30 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1280x720-24-30fps.webm

1280x720 (每秒 50 或 60 個影格)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2-y tos-1280x720-50-60fps.webm

1920x1080 (每秒 24、25 或 30 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-24-30fps.webm

1920x1080 (每秒 50 或 60 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-50-60fps.webm

2560x1440 (每秒 24、25 或 30 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-24-30fps.webm

2560x1440 (每秒 50 或 60 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-50-60fps.webm

3840x2160 (每秒 24、25 或 30 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-3840x2160-24-30fps.webm

3840x2160 (每秒 50 或 60 個影格)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -speed 2 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm