前言
多年來有手持裝置看影片的習慣,早在 PSP 至現在的 Smart Phone。相對於目前的高畫質影片,雖然畫質驚人,但容量也超出內存或記憶卡限制。
所以我常常利用 ffmpeg 來進行轉檔至 720p 的大小,以手持裝置來說 720p 是一個不失畫質又兼具容量的做法。
常常手key一堆ffmpeg的指令實在很累,所以自已寫了一個script:ffsogi(手機),方便我快速進行轉檔的工作,而且又加入了VAAPI/NVENC硬體壓縮的方式。
ffsogi github link
ffsogi有3個主程式
ffsogi:CPU encode
ffsogi_va:AMD/Intel vaapi encode
ffsogi_nv:Nvidia nvenc encode(需要Nvidia驅動程式)
軟體壓縮 vs 硬體壓縮
目前的顯示晶片都用硬體壓縮的功能,三大廠 Intel, AMD, Nvidia 都有,依照晶片的不同有不一樣的支援。
Intel/AMD 是使用 VAAPI Library的方式實作,Nvidia是自行開發的,還好目前 ffmpeg-5.x 的版本都支援。
Intel/AMD 顯卡可以執行 vainfo 列出支援的codecs. 像我的Intel ARC A380顯卡支援列表如下:
libva info: VA-API version 1.16.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_16 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.16 (libva 2.15.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.6.4 () vainfo: Supported profile and entrypoints VAProfileNone : VAEntrypointVideoProc VAProfileNone : VAEntrypointStats VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSliceLP VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSliceLP VAProfileJPEGBaseline : VAEntrypointVLD VAProfileJPEGBaseline : VAEntrypointEncPicture VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP VAProfileHEVCMain : VAEntrypointVLD VAProfileHEVCMain : VAEntrypointEncSliceLP VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSliceLP VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile0 : VAEntrypointEncSliceLP VAProfileVP9Profile1 : VAEntrypointVLD VAProfileVP9Profile1 : VAEntrypointEncSliceLP VAProfileVP9Profile2 : VAEntrypointVLD VAProfileVP9Profile2 : VAEntrypointEncSliceLP VAProfileVP9Profile3 : VAEntrypointVLD VAProfileVP9Profile3 : VAEntrypointEncSliceLP VAProfileHEVCMain12 : VAEntrypointVLD VAProfileHEVCMain422_10 : VAEntrypointVLD VAProfileHEVCMain422_12 : VAEntrypointVLD VAProfileHEVCMain444 : VAEntrypointVLD VAProfileHEVCMain444 : VAEntrypointEncSliceLP VAProfileHEVCMain444_10 : VAEntrypointVLD VAProfileHEVCMain444_10 : VAEntrypointEncSliceLP VAProfileHEVCMain444_12 : VAEntrypointVLD VAProfileHEVCSccMain : VAEntrypointVLD VAProfileHEVCSccMain : VAEntrypointEncSliceLP VAProfileHEVCSccMain10 : VAEntrypointVLD VAProfileHEVCSccMain10 : VAEntrypointEncSliceLP VAProfileHEVCSccMain444 : VAEntrypointVLD VAProfileHEVCSccMain444 : VAEntrypointEncSliceLP VAProfileAV1Profile0 : VAEntrypointVLD VAProfileAV1Profile0 : VAEntrypointEncSliceLP VAProfileHEVCSccMain444_10 : VAEntrypointVLD VAProfileHEVCSccMain444_10 : VAEntrypointEncSliceLP上述列表中的 VAEntrypointVLD 表示支援硬體解壓縮,VAEntrypointEncSliceLP 表示支援硬體壓縮。 Intel ARC 顯卡幾乎支援所有 codec,從AVC, HEVC, 甚至 AV1 都有支援,值得推薦入手。
轉檔的過程基本上是
[input video] ----- [decoder] ----- <decode to yuv or raw> ----- [encoder] ----- [output video]
所以先將影片解壓縮,再交給encoder壓縮。上圖的decoder可以是cpu, 硬解卡,encoder的部份可以是 cpu,硬壓卡。
如果您的顯卡支援影片的codec的話,整個轉檔過程幾乎不用CPU,完全是顯卡來運作,既省電,電腦又能做別的工作。
反之,如果影片codec不支援的話,例如動畫檔常見的H264 10bit,幾乎沒有硬體解壓,這時候就只能用 CPU 軟解後,再 pass 給硬體壓縮,只是效率比較慢。
目前 ffsogi 就支援上述兩種狀況。
ffsogi參數
直接執行 ffsogi 列出使用參數,直接看下面範例試用吧
ffsogi使用範例
Transcode 1080p video to hevc 8bit and downscale to 720p.
ffsogi -i "input.mkv" -o output.mp4 -s 7 -c 24
ffsogi_va -i "input.mkv" -o output.mp4 -s 7 -c 24 (For AMD/Intel)
ffsogi_nv -i "input.mkv" -o output.mp4 -s 7 -c 24 (For Nvidia)
Transcode 1080p video to avc 8bit and downscale to 720p.
ffsogi -i "input.mkv" -o output.mp4 -s 7 -c 24 -f h264
ffsogi_va -i "input.mkv" -o output.mp4 -s 7 -c 24 -f h264 (For AMD/Intel)
ffsogi_nv -i "input.mkv" -o output.mp4 -s 7 -c 24 -f h264 (For Nvidia)
Transcode 4K HDR video to hevc 8bit SDR and downscale to 1080p.
ffsogi -i "input.mkv" -o output.mp4 -s 1080 -c 24 --hdr2sdr
NOTE: 這部份沒有硬壓支援,可能未來會有。
Transcode 1080 video to hevc 8bit downscale to 720p using HW decode/encode. (best performance)
ffsogi_va -i "input.mkv" -o output.mp4 -c 24 --hw -s 7
ffsogi_nv -i "input.mkv" -o output.mp4 -c 24 --hw -s 7
結語
文章發布的時間時,ffmpeg最新是5.1版,該版還不支援 av1 硬壓,無法體會 av1 壓縮的效率,期待 ffmpeg-cartwheel 的patch。
未來 ffmpeg 支援 av1 硬壓後,再來更新 ffsogi_va/nv 的支援,請持續追蹤 ffsogi github
沒有留言:
張貼留言