◎メインサイトとブログとSNS
VSRX-2020 - オリジナルOSやライブラリ、アプリケーションのリファレンスとプログラミングなどの各種テクニックを公開しているメインサイト
RED - 音楽・ドラマ・アイドル・ゆるキャラ・食べ物・副業・公営ギャンブルなどの話題を取り上げるブログ
Instagram / Youtube
最近の記事

2020年12月06日

ffmpeg+VA-APIでハードウェアエンコードをする時にはhwaccelオプションでハードウェアデコードしない方が綺麗に仕上がる

◇FFmpeg VAAPI
https://trac.ffmpeg.org/wiki/Hardware/VAAPI

LinuxにおいてインテルやAMDのGPUを使ってffmpegでハードウェアエンコードする場合は、VA-APIというAPIを通して行います。公式Wikiにその方法が詳しく記載されていますが、ffmpegのオプションの使い方でかなり仕上がりが変わってきます。特にデコード側は重要で、デコードで綺麗に取り込む事で、出来上がる動画は綺麗に仕上がります。
VA-APIを使う時に、デコードもVA-APIを使う事ができ、ffmpegでは「-hwaccel vaapi -hwaccel_output_format vaap」というオプションで指定します。しかし、VA-APIによるデコードは画質がかなり荒くなり、仕上がりも良くありません。そこで、ソフトウェアデコードを行って、エンコードはVA-APIによるハードウェアエンコードを行う事で、画質がぐんと良くなります。
ffmpeg+VA-APIでのソフトウェアデコードは、「-hwaccel vaapi -hwaccel_output_format vaap」を付けなければ、自動的に指定されます。デコードをソフトウェアにする事で、ハードウェアエンコードは遅くなりますが、CPUだけでエンコードするよりも速いので意外とおすすめの方法です。

◇ffmpeg+VA-API環境におけるソフトウェアデコードとハードウェアエンコードのコマンド例

◇H.264/AVCの場合
ffmpeg -y -vaapi_device /dev/dri/card0 \
-i xxx.mp4 \
-vf "fps=29.97,format=nv12,hwupload,scale_vaapi=w=1980:h=1080" \
-c:v h264_vaapi -profile:v 100 -level 41 -b:v 8M -aspect 16:9 \
-c:a aac -b:a 256k \
yyy.mp4
◇H.265/HEVCの場合
ffmpeg -y -vaapi_device /dev/dri/card0 \
-i xxx.mp4 \
-vf "fps=29.97,format=p010,hwupload,scale_vaapi=w=1980:h=1080" \
-c:v hevc_vaapi -profile:v 2 -level 51 -b:v 8M -aspect 16:9 \
-c:a aac -b:a 256k \
yyy.mp4

xxx.mp4はソース動画ファイル
yyy.mp4は出力動画ファイル
posted by takatan at 11:37| 大阪 ☀| linux | このブログの読者になる | 更新情報をチェックする