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は出力動画ファイル