Av1an:將影片轉檔成AV1編碼的工具

將影片用Av1an轉檔成AV1編碼,可在維持影片品質的情況下,大大減少影片容量。

影片壓縮後有助於網際網路傳輸,參考VMAF的分數下,轉檔後的畫面品質也沒有降低很多。

本文將講解Av1an轉檔指令的用法,段落#4有實際例子,並用VMAF分數評比轉檔的影片品質好壞。

1. 選擇AV1理由

AV1(AOMedia Video 1)是新一代的影片編碼格式,由AOMedia組織開發,開源且免授權金,主要跟H.265(HEVC)競爭。目前有Youtube和Netflix使用,可有效減少串流影片的檔案大小。

手機和電腦上的VLC、MPV、Chromium系瀏覽器皆支援硬體解碼播放AV1編碼的影片。

為簡化AV1影片的轉檔流程,Av1an出現了。這是一套用Rust寫成的命令行影片轉檔框架,支援各大作業系統。提供超可適性視訊編碼,支援以VMAF評估輸出影片品質和套用VapourSynth指令稿,還可以中途暫停日後繼續轉檔。

Av1an內建的編碼器有AOM、SVT-AV1、rav1e、VP8、VP9、H.264(AVC)、H.265(HEVC)。

2. 安裝Av1an

Av1an需要使用命令行操作。從下面擇一方法安裝之。

2.1. Windows執行檔

Windows版exe可到Github relsease下載,在exe所在位置按Shift右鍵開啟終端機即可執行指令。

2.2. Linux套件管理員

Arch Linux可以直接用套件管理員安裝Av1an:

1
sudo pacman -S av1an

2.3. 用Rust cargo安裝

電腦必須先裝有Rust環境,才能執行此指令:

1
cargo install av1an

2.4. 用Docker跑

安裝Docker後。在目前的目錄建立Videos目錄,並將input.mp4放進去,再切換至該目錄拉取masterofzen/av1an的映像。

1
sudo docker run --privileged -v "$(pwd)" --user $(id -u):$(id -g) -it --rm masterofzen/av1an:latest -i input.mp4 [參數]

3. Av1an轉檔指令

Av1an轉檔後的影片一律會變成.mkv格式。

Av1an指令基本用法如下,只提供影片檔的參數,其他使用預設值轉檔。

1
av1an [參數] -i <影片檔案>

可以進一步使用其他參數指定要使用的編碼器、輸出目錄等。

詳細的參數用法請參考原作者寫的文件,下面說明比較重要的參數。

3.1. 參數解說

-i <影片檔案>的參數之後,使用--encoder參數指定要使用的編碼器,不填寫的話預設為aom。


--video-params參數設定影片編碼的細部參數,以引號""框起來。由於參數是直接傳給編碼器,故不相容ffmpeg的語法。

以aom編碼器來說,影片的參數--end-usage壓縮模式有CBR、VBR、Quality、Constrained Quality。

--end-usage壓縮模式預設是cbr(固定位元速率)。

--end-usage另一個壓縮模式為vbr(可變數位元速率),預設是2 pass mode。

VBR 2 pass能進一步減少檔案大小,然而VBR比CBR長很多,不建議使用。

Quality和Constrained Quality壓縮模式下又有cq-level參數,預設為30,cq-level數值越高檔案越小,但畫質越差。

此外,可用--target-bitrate設定位元率(kbps),--bit-depth設定位元深度,預設為aom從原始影片判斷得來,建議值為10(bit)。--cpu-used指定要使用的CPU核心數目,--threads指定使用的CPU線程數。


除了影片之外,尚有--audio-params參數可以設定轉檔音訊的參數。不填的話則是從原始影片直接複製。

參數同樣需要用引號框起來。此處的參數相容ffmpeg的語法。

例如將輸入影片的音訊轉為開源的opus格式,取樣率為常見的48000Hz:

1
--audio-params="-c:a libopus -b:a 48000"

3.2. Target Quality模式

不事前猜想適合的CQ/CRF數值,而以Netflix提出的VMAF影片品質評估工具為依歸,指定一個分數,再讓演算法計算出適合CQ/CRF數值的轉檔模式。

VMAF預設是以1920x1080解析度下去計算,分數越高代表影片品質越好,93~95分以上人眼就會難以分辨轉檔後的品質差異。

範例指令如下:

1
av1an -i input.mkv --target-quality 95

3.3. 如何選擇AV1編碼器

AV1編碼器關乎轉檔速度與壓縮品質,目前主要有這三個:aomenc、SVT-AV1、rav1e。

名稱 簡介
aomenc 又稱libaom,最早基於Google的libvpx開發,是AV1官方的參考實作。
SVT-AV1 由Intel與Netfelix共同研發的編碼器,已被AOMedia所接納,作為未來編碼器的發展方向。
rav1e 原由Mozilla開發,現由VLC維護的編碼器,基於Xiph的編碼器所開發,注重簡潔。

根據Reddit r/AV1板上網友的總結。

壓縮品質最佳到最差(壓縮太差會丟失影片細節):
#1 rav1e
#2 aomenc
#3 SVT-AV1

編碼速度最快到最慢:
#1 SVT-AV1
#2 aomenc
#3 rav1e

ffmpeg的Wiki也說即使rav1e宣稱是最快速的AV1編碼器,但其實很吃設定檔。

所以我個人會選擇速度與品質居於中間的aomenc。

4. 實測將H.264影片轉檔成AV1

我想將一部影片轉檔成方便用於串流播放的AV1格式,並保持音訊高音質。

  • 作業系統:Arch Linux
  • CPU: 4核心Intel i5-7400

  1. 這裡的原始影片input.mkv採用H.264編碼,解析度1920x1080,影片大小692.8MB,時間長度23分鐘59秒。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
General
Complete name                            : input.mp4
Format                                   : MPEG-4
File size                                : 693 MiB
Overall bit rate mode                    : Variable
Overall bit rate                         : 4 036 kb/s

Video
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Bit rate                                 : 3 936 kb/s
Maximum bit rate                         : 28.3 Mb/s
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 23.976 (24000/1001) FPS

Audio
Format                                   : AAC LC
Bit rate mode                            : Variable
Bit rate                                 : 96.0 kb/s
Maximum bit rate                         : 120 kb/s
Channel(s)                               : 2 channels
Channel layout                           : L R
Sampling rate                            : 48.0 kHz
Frame rate                               : 46.875 FPS (1024 SPF)
  1. 以下轉檔指令參考作者文件,追求速度快和保持品質。影片部份使用Q模式,cq-level為22;使用6核CPU和64執行緒確保速度;音訊則轉換為開源的opus格式,取樣率48000Hz,啟用VBR。
1
av1an -i "input.mp4" --video-params="--end-usage=q --cq-level=22 --bit-depth=10 --lag-in-frames=35 --enable-fwd-kf=1 --enable-qm=1 --enable-chroma-deltaq=1 --quant-b-adapt=1 --mv-cost-upd-freq=2 --tile-columns=2 --tile-rows=1 --cpu-used=6 --threads=64" --audio-params="-c:a libopus -b:a 48000 -vbr:a on"
  1. 轉檔首先會分析畫面,接著開始轉換,看到檔案變大莫驚慌,預估的檔案大小和時間會逐步減少。

4核心的Intel i5-7400 CPU轉檔花了3小時。原始影片692.8MB → 轉檔後489.1MB,影片格式一律會轉為MKV。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Complete name                            : input_aom.mkv
Format                                   : Matroska
File size                                : 489 MiB
Overall bit rate                         : 2 849 kb/s

Video
ID                                       : 1
Format                                   : AV1
Format/Info                              : AOMedia Video 1
Format profile                           : Main@L4.0
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 23.976 (24000/1001) FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 10 bits

Audio
ID                                       : 2
Format                                   : Opus
Codec ID                                 : A_OPUS
Channel(s)                               : 2 channels
Channel layout                           : L R
Sampling rate                            : 48.0 kHz
Bit depth                                : 32 bits

從其他的測試結果來看,檔案越大縮小效果越明顯。比方說3GB影片檔可以縮小到1GB以內。

不過,AV1的編碼器跟H264/H.265比起來仍比較慢,這是目前市面上AV1編碼器的通病。

最後用ffmpeg 5.1.2配合VMAF評比分數:

1
ffmpeg -i input_aom.mkv -i input.mkv -filter_complex libvmaf -f null -

得到97分成績。VMAF在93~95分以上判定為人眼不易分辨的程度,代表轉檔後影片品質並無顯著下降。

參考資料

如果本網站文章對您有幫助,歡迎贊助我。