ffmpeg 4.0 から追加されたエンコーダ。AMF(Advanced Media Framework)SDK を使ったAMD の VCE(Video Coding Engine)を ffmpeg で使う方法。RX470 で試したところ、h264_amfのほうが、hevc_amfよりも VAMFスコアを見る限り高画質でエンコード速度は少し遅く、デコード速度が早くなる。
関連記事
hardware acceleration の Wiki:HWAccelIntro – FFmpeg
準備
- SDK を保存。GitHub – GPUOpen-LibrariesAndSDKs/AMF: The Advanced Media Framework (AMF) SDK provides developers with optimal access to AMD devices for multimedia processing
- SDK を展開し、amf/public/include の中身を、/usr/local/include/AMF にコピーする。AMF ディレクトリは無いので新しくフォルダを作る。
- ffmpeg の configure では自動検出するのでオプションを追加する必要は無い。不必要なら
--disable-amf
をつける。
エンコード例
libx264などで使える、-crf、-minrate、-maxrateは使えないので、-b:vでビットレート指定、または-qmin、-qmaxで品質の上下指定、-qp_i、-qp_p、-qp_bで各フレームの品質指定をする。低解像度で-qmin、-qmaxの間隔が広いと思ったほどビットレートが既定値の 2000kb/s から変化しないのでそのときは両方ともを大きくし、ビットレートが必要とするなら両方とも小さくする。-pass指定ができないので2パスエンコードはできない。
ffmpeg -i input -c:v h264_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mp4
ffmpeg -i input -c:v hevc_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mkv
可逆圧縮例
ffmpeg -i input -c:v h264_amf -quality quality -rc cqp -qmin 0 -qmax 0 -g 1 -c:a copy output.mp4
デコード例
Direct3D 11でハードウェア支援のデコードができる。複数GPUを挿しているときは-hwaccel_deviceの数値を変える。
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -i input -c:v h264_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -i input -c:v hevc_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mkv
h264_amf のオプション
公式ドキュメント PDF:AMF_Video_Encode_API
ffmpeg -h encoder=h264_amf
品質オプションの、-qualityは 既定値のspeedからbalanced、qualityの順番に画質がよくなる代わりに処理が遅くなる。
-g[int]
group of picture size で、keyint のこと
既定値:-1(10秒に1枚キーフレームが挿入される)
hevc_amf のオプション
公式ドキュメント PDF:AMF_Video_Encode_HEVC_API
ffmpeg -h encoder=hevc_amf
品質オプションの、-qualityは 既定値のspeedでbalanced, qualityは同じ品質の動画にエンコードされる。
-g[int]
group of picture size で、keyint のこと
既定値:-1(10秒に1枚キーフレームが挿入される)
opencl フィルタを併用する
RX470 には opencl が使えるので、これを使ってフィルタを併用する。対応フィルタは opencl でブログ内検索する。ポイントは ocl のデバイスを指定し、フィルタ間でhwupload,hoge_opencl,hwdownload
のように ocl フィルタを挟む。
ffmpeg -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input.mp4 -vf hwupload,avgblur_opencl,hwdownload,unsharp -c:v h264_amf -c:a copy output.mp4
ハードウェア支援をする。
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input.mp4 -vf hwdownload,format=nv12,hwupload,roberts_opencl,format=nv12 -c:v h264_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mp4
その他は、ハードウェアデコーダ、フィルタ、エンコーダを組み合わせるを参照。