ffmpeg 4.0 から追加されたエンコーダ。AMF(Advanced Media Framework)SDK を使ったAMD の VCE(Video Coding Engine)を ffmpeg で使う方法。RX470 で試したところ、h264_amfのほうが、hevc_amfよりも VMAFスコアを見る限り高画質でエンコード速度は少し遅く、デコード速度が早くなる。
関連記事
hardware acceleration の Wiki:HWAccelIntro – FFmpeg
公式の Wiki:FFmpeg and AMF HW Acceleration · GPUOpen-LibrariesAndSDKs/AMF Wiki
準備
- 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
をつける。
Windows以外
Gentooでamf-amdgpu-proを利用してGPUで動画エンコードを行えるffmpegを作る方法のメモ – joker1007’s diary
[Question]: What are the proper FFMPEG syntax usages with AMD AMF drivers on Ubuntu Linux? · Issue #332 · GPUOpen-LibrariesAndSDKs/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
ROIサポートしているのでaddroi
フィルタが使えるはず。
映像の特定領域だけ品質を変える addroi
デコード例
Direct3D 9、Direct3D 11でハードウェア支援のデコードができる。複数GPUを挿しているときは-hwaccel_deviceで数値を指定する。
Direct3D 9
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -c:v h264_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -c:v hevc_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mkv
Direct3D 11
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -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 -i input -c:v hevc_amf -quality quality -rc cqp -qmin 15 -qmax 30 -c:a copy output.mkv
対応コーデック。解像度とフレームレートの記載がない。HEVC 10bit 4:2:0、VP9 10bit 4:2:0があるので一般的なHDRやAV1も再生できる。まだAV1の10ビット深度には対応していない。
AMF/AMF_Video_Decode_API.pdf at master · GPUOpen-LibrariesAndSDKs/AMF
h264_amf のオプション
公式ドキュメント PDF:AMF_Video_Encode_API
ffmpeg -h encoder=h264_amf
品質オプションの、-qualityは 既定値のspeedからbalanced、qualityの順番に画質がよくなる代わりに処理が遅くなる。
エンコーダオプションの既定値。
amfenc_h264.c · FFmpeg/FFmpeg
- -refs:-1
- -aspect:0
- -qmin:-1
- -qmax:-1
- -b:2M
- -g:250
- -slices:1
- -flags:+loop
hevc_amf のオプション
公式ドキュメント PDF:AMF_Video_Encode_HEVC_API
ffmpeg -h encoder=hevc_amf
品質オプションの、-qualityは 既定値のspeedでbalanced, qualityは同じ品質の動画にエンコードされる。
エンコーダオプションの既定値。
amfenc_hevc.c · FFmpeg/FFmpeg
- -refs:-1
- -aspect:0
- -b:2M
- -g:250
- -slices:1
- -qmin:-1
- -qmax:-1
av1_amf のオプション
公式ドキュメント PDF:AMF_Video_Encode_AV1_API
ffmpeg -h encoder=av1_amf
シークできないファイルにエンコードされたら-header_insertion_mode gopを追加する。
Unable to seek in AV1 encoded videos : ffmpeg
エンコーダオプションの既定値。
libavcodec/amfenc_av1.c · FFmpeg/FFmpeg
- -refs:-1
- -aspect:0
- -b:2M
- -g:250
- -qmin:-1
- -qmax:-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
その他は、ハードウェアデコーダ、フィルタ、エンコーダを組み合わせるを参照。
有用な記事をありがとうございます。
VAMFスコア は VMAFスコア の typo でしょうか。
コメントありがとうございます。修正しました。