FFmpeg筆記
Published:Updated:
基本知識
CRF 越高壓縮率越高,畫質越低。而 CRF 值越低,畫質越高,文件容量也越大。CRF 範圍是指數級的,因此增加 CRF 值 +6 會導致位元率/文件大小大約減半。
預設 CRF 值:
- H.264: 23
- H.265 (x265): 28
- VP9: 31
- AV1: 35
不同編解碼器的 CRF 是數值各自獨立,推薦的 CRF 設置可以在這裡找到。
CRF 12 才能使高解析度的影片在超大屏幕上恰好視覺無損,那 CRF 18 如何能視覺無損?
The_Vista_Group@reddit: Visual lossless quality always depends on the source. That's why there are various encoder parameters to tweak.
安裝
GUI: HandBrake. HandBrake 使用 FFmpeg 作為後端轉碼
CLI: FFmpeg
brew install ffmpeg
使用
所有 GUI 背後都還是調用 FFmpeg,因此建議可以直接學 FFmpeg CLI。
HandBrake
- 選擇一個
Preset - 點擊
Open Source - 選擇
title並單獨調整 - 將此標題添加到隊列
- 添加所有文件到隊列後,開始轉換。
FFmpeg 使用方法
轉換整個資料夾
將文件夾中的 \*.mov 轉換為 h.265 並輸出到 ../output 文件夾
for file in *.mov;
do ffmpeg -i "$file" -c:v libx265 -tag:v hvc1 -crf 28 "$../output/{file%.mov}.mp4";
done
加上 hvc1 標籤以支援蘋果設備讀取。
Two-Pass Conversion
multi-pass 並非是用來增強畫質,而是用來控制流量而已。簡單地說,如果用 CRF(恒定質量)壓出一個 1GB 的影片,比較 2-pass 壓出同樣大小的影片,兩者畫質是幾乎沒有分別的。2-pass 畫質比較好是指和 CBR、ABR 的比較。如果沒有需要精確的流量控制,事實上並不需要用 multi-pass。而 pass 越多次,會越接近設定的流量。Source
for file in *.mov; do
base="${file%.mov}"
ffmpeg -y -i "$file" -c:v libx265 -b:v 1500k -x265-params pass=1 -an -f null /dev/null && \
ffmpeg -i "$file" -c:v libx265 -b:v 1500k -x265-params pass=2 -c:a copy "../output/${base}.mp4"
done
YouTube 影片
YouTube 1080p 影片的畫質設定 (Source)
ffmpeg -i <INPUT> -c:v libx264 -preset slow -crf 18 -vf scale=out_color_matrix=bt709 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -c:a aac -ar 48000 -ac 2 -b:a 320k -profile:v high -level 4.0 -bf 2 -coder 1 -pix_fmt yuv420p -b:v 10M -threads 4 -cpu-used 0 -r 30 -g 15 -movflags +faststart <OUTPUT>
轉碼評分
VMAF 是 Netflix 開發的客觀全參考視訊品質指標。
ffmpeg -i "outputFile" -i "sourceFile" -lavfi libvmaf=log_fmt=json:log_path=output.json -f null -
Find your vmaf models for macOS brew install
brew list libvmaf
# find "outputPath" -name "vmaf_v0.6.1.pkl"
find "/opt/homebrew/Cellar/libvmaf/3.0.0" -name "vmaf_v*.pkl"
ffmpeg -i input.mp4 -i output.mp4 -lavfi libvmaf="model_path=/path/model/vmaf_v0.6.1.pkl" -f null -