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

準備

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の順番に画質がよくなる代わりに処理が遅くなる。

-usageの内容

エンコーダオプションの既定値。
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は 既定値のspeedbalanced, qualityは同じ品質の動画にエンコードされる。

-usageの内容

エンコーダオプションの既定値。
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

その他は、ハードウェアデコーダ、フィルタ、エンコーダを組み合わせるを参照。

2 thoughts on “AMD VCE 対応の ffmpeg をつくる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)