2022年12月24日 星期六

ffsogi 一個簡易的ffmpeg轉檔小工具。for mobile device。

前言

 多年來有手持裝置看影片的習慣,早在 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

沒有留言: