ffmpeg で使える QSV(Intel Quick Sync Video)のビルド方法と使い方。CPU の世代によって使えるエンコーダ、デコーダ、オプションやフィルタが異なる。
- CPU の世代が分かる :Intel Core – Wikipedia
- hardware acceleration の Wiki :HWAccelIntro – FFmpeg
- 各世代のエンコード、デコードの対応表:Media Capabilities Supported by Intel Hardware、Hardware/QuickSync – FFmpeg、Intel Graphics Technology – Wikipedia、Intel Quick Sync Video – Wikipedia、GitHub – intel/media-driver、QSVEnc/GPUFeatures at master · rigaya/QSVEnc
- 2016年1月次点での公式のベンチマーク PDF :Intel® Quick Sync Video and FFmpeg Performance – cloud-computing-quicksync-video-ffmpeg-white-paper.pdf
- Intel® Iris® Xeのベンチマーク:media-delivery/intel-iris-xe-max-graphics.md at master · intel/media-delivery
- 公式のドキュメント群:media-delivery/doc at master · intel/media-delivery · GitHub
関連記事
他のサイト
- Compiles FFmpeg with Cartwheel Patches, Quick Sync and OneVpl support. Careful needs testing, currently Work in Process. Read comments. · GitHub
- This gist will generate an Intel QSV-enabled FFmpeg build using the open source Intel Media SDK. Testbed used: Ubuntu 18.04LTS. A fallback is also provided for the intel vaapi driver where needed.
- Ubuntu* Intel® software for general purpose GPU capabilities documentation
公式のコマンド例
- media-delivery/doc/quality-lowdelay.rst at master · intel/media-delivery · GitHub
- media-delivery/doc/quality.rst at master · intel/media-delivery · GitHub
- media-delivery/doc/reference-command-lines.rst at master · intel/media-delivery · GitHub
目次 [非表示]
基本となるファイル
- Download FFmpeg
ソースコード - lu-zero/mfx_dispatch
Intel Media SDK 2014 が必要とされていたが mfx_dispatch をインストールするので使わない - GitHub – intel/libvpl: Intel® Video Processing Library (Intel® VPL) dispatcher, tools, and examples
AV1や新機能はこちらをリンクしないと使えない
Windows XPでも使えるffmpegはこちらで配布している。
FFmpegダウンロード お気に入りの動画を携帯で見よう
ffmpeg をつくる
Windows 環境ならmedia-autobuild_suiteを使うのが楽。--enable-libmfx
を指定する。新機能を使うには--enable-libvpl
を指定するが、media-autobuild_suiteは対応していない。
参考になるコード
Building FFmpeg with QSV on Windows* and Linux* Intel Platform
FFmpeg-Builds/scripts.d/50-onevpl.sh at master · BtbN/FFmpeg-Builds · GitHub
エラーの回避方法
以下のようなエラーが出る場合は-look_ahead 0をつける。現在は既定値が 0 になっているので設定する必要はない。
More than one of: { constant qscale, lookahead, VCM } requested, only one of them can be used at a time.Error initializing output stream 0:0 — Error while opening encoder for output stream #0:0 – maybe incorrect parameters such as bit_rate, rate, width or height
以下のようなエラーが出る場合は-init_hw_device qsv:hwをつける。
https://trac.ffmpeg.org/ticket/6492より。
詳しくはhttps://ffmpeg.org/ffmpeg-all.html#Advanced-Video-options
No device available for encoder (device type qsv for codec h264_qsv).
Selected ratecontrol mode is not supported by the QSV runtime. Choose a different mode.
Error initializing output stream 0:0 — Error while opening encoder for output stream #0:0 – maybe incorrect parameters such as bit_rate, rate, width or height
逆に、付けるとエラーになる場合-init_hw_device qsv:hwを外す。
https://trac.ffmpeg.org/ticket/6827より。
Failed to create Direct3D device
Device creation failed: -1313558101.
Failed to set value ‘qsv:hw’ for option ‘init_hw_device’: Unknown error occurred
以下のようなエラーが出る場合は読み込み時のバッファを増やす。
Decoding pixel format ‘(null)’ is not supported
Error while decoding stream #0:0: Function not implemented
ffmpeg -analyzeduration 30M -probesize 30M -i input.ts -c copy output.ts
またドロップしたフレームがあり読み込みに失敗するときには、それを読み込まない入力オプション-fflags +discardcorruptを付ける方法もある。以下は QSV フィルタの併用例。
ffmpeg -hwaccel qsv -c:v mpeg2_qsv -fflags +discardcorrupt -analyzeduration 30M -probesize 30M -i input.ts -vf deinterlace_qsv,vpp_qsv=1280:720,hwdownload,format=nv12,fps=30000/1001,decimate -r 24000/1001 -c:v h264_qsv -g 240 -look_ahead 0 -q:v 20 -c:a copy out.mp4
‘corrupt input packet in stream 1’ error in FFMPEG – Stack Overflow
以下のエラーが出る場合はhwupload
フィルタをつける。
The input must have a hardware frame reference.
以下のエラーが出る場合はhwupload
フィルタのフレーム数を増やす。
Error while filtering: Cannot allocate memory
Failed to inject frame into filter network: Cannot allocate memory
Error while processing the decoded data for stream #0:0
QSV リサイズフィルタの利用例。scale_qsv
フィルタはvpp_qsv
フィルタに統合した。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -fflags +discardcorrupt -i input.mp4 -vf hwupload=extra_hw_frames=10,vpp_qsv=w=1280:h=720 -c:v h264_qsv -g 240 -q:v 20 -c:a copy out.mp4
メインディスプレイは外部GPUから、サブディスプレイはintel GPUをつなげているときにQSVが使えないときはchild_deviceの番号を0以外にする。
ffmpeg -init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va -i input.h264
- Anyway to select GPU on QSV encoder? : ffmpeg
- lavfi: add hwdevice flag to hwupload/hwmap · FFmpeg/FFmpeg@9bf1848 · GitHub
- codec – QSV hardware acceleration does not work with ffmpeg 7.0 – Super User
- なかがわ@生涯欠陥 on X
Windows 以外の環境
centos7でffmpeg h264_qsv感想など。 : archive.org
qsv_paramsについて
ffmpeg 7.0より先のリリースでqsv_paramsに対応した。対応するパラメータ一覧が整っていないが、obs-qsv-onevplのqsv_params.hppにあるqsv_param_tの一部が使えるようだ。
- lavc/qsvenc: add support for oneVPL string API · FFmpeg/FFmpeg@b1037d4 · GitHub
- Re: Re:Enabling EncTools h264 in oneVPL – Intel Community
- obs-qsv-onevpl/obs-qsvonevpl/helpers/qsv_params.hpp at main · ma3uk/obs-qsv-onevpl · GitHub
ffmpeg -re -f lavfi -i testsrc2 -vf format=nv12 -c:v h264_qsv -qsv_params TargetUsage=1:GopPicSize=30:GopRefDist=2:GopOptFlag=0:BitDepthChroma=8:BitDepthLuma=8:LowPower=1:NumSlice=1:NumRefFrame=4 -global_quality 20 -f null -
h264_qsvエンコーダの設定
ffmpeg -h encoder=h264_qsv
で見られるエンコード設定とエンコーダ全般に指定できる設定の2つがある。
Encoder h264_qsv [H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration)]: | |
General capabilities: delay hybrid | |
Threading capabilities: none | |
Supported hardware devices: qsv qsv qsv | |
Supported pixel formats: nv12 qsv | |
h264_qsv encoder AVOptions: | |
-async_depth <int> E..V....... Maximum processing parallelism (from 1 to INT_MAX) (default 4) | |
-preset <int> E..V....... (from 0 to 7) (default 0) | |
veryfast 7 E..V....... | |
faster 6 E..V....... | |
fast 5 E..V....... | |
medium 4 E..V....... | |
slow 3 E..V....... | |
slower 2 E..V....... | |
veryslow 1 E..V....... | |
-forced_idr <boolean> E..V....... Forcing I frames as IDR frames (default false) | |
-low_power <boolean> E..V....... enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.) (default auto) | |
-qsv_params <dictionary> E..V....... Set QSV encoder parameters as key1=value1:key2=value2:... | |
-rdo <int> E..V....... Enable rate distortion optimization (from -1 to 1) (default -1) | |
-max_frame_size <int> E..V....... Maximum encoded frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_i <int> E..V....... Maximum encoded I frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_p <int> E..V....... Maximum encoded P frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_slice_size <int> E..V....... Maximum encoded slice size in bytes (from -1 to INT_MAX) (default -1) | |
-bitrate_limit <int> E..V....... Toggle bitrate limitations (from -1 to 1) (default -1) | |
-mbbrc <int> E..V....... MB level bitrate control (from -1 to 1) (default -1) | |
-extbrc <int> E..V....... Extended bitrate control (from -1 to 1) (default -1) | |
-adaptive_i <int> E..V....... Adaptive I-frame placement (from -1 to 1) (default -1) | |
-adaptive_b <int> E..V....... Adaptive B-frame placement (from -1 to 1) (default -1) | |
-p_strategy <int> E..V....... Enable P-pyramid: 0-default 1-simple 2-pyramid(bf need to be set to 0). (from 0 to 2) (default 0) | |
-b_strategy <int> E..V....... Strategy to choose between I/P/B-frames (from -1 to 1) (default -1) | |
-dblk_idc <int> E..V....... This option disable deblocking. It has value in range 0~2. (from 0 to 2) (default 0) | |
-low_delay_brc <boolean> E..V....... Allow to strictly obey avg frame size (default auto) | |
-max_qp_i <int> E..V....... Maximum video quantizer scale for I frame (from -1 to 51) (default -1) | |
-min_qp_i <int> E..V....... Minimum video quantizer scale for I frame (from -1 to 51) (default -1) | |
-max_qp_p <int> E..V....... Maximum video quantizer scale for P frame (from -1 to 51) (default -1) | |
-min_qp_p <int> E..V....... Minimum video quantizer scale for P frame (from -1 to 51) (default -1) | |
-max_qp_b <int> E..V....... Maximum video quantizer scale for B frame (from -1 to 51) (default -1) | |
-min_qp_b <int> E..V....... Minimum video quantizer scale for B frame (from -1 to 51) (default -1) | |
-scenario <int> E..V....... A hint to encoder about the scenario for the encoding session (from 0 to 8) (default unknown) | |
unknown 0 E..V....... | |
displayremoting 1 E..V....... | |
videoconference 2 E..V....... | |
archive 3 E..V....... | |
livestreaming 4 E..V....... | |
cameracapture 5 E..V....... | |
videosurveillance 6 E..V....... | |
gamestreaming 7 E..V....... | |
remotegaming 8 E..V....... | |
-avbr_accuracy <int> E..V....... Accuracy of the AVBR ratecontrol (unit of tenth of percent) (from 0 to 65535) (default 0) | |
-avbr_convergence <int> E..V....... Convergence of the AVBR ratecontrol (unit of 100 frames) (from 0 to 65535) (default 0) | |
-skip_frame <int> E..V....... Allow frame skipping (from 0 to 3) (default no_skip) | |
no_skip 0 E..V....... Frame skipping is disabled | |
insert_dummy 1 E..V....... Encoder inserts into bitstream frame where all macroblocks are encoded as skipped | |
insert_nothing 2 E..V....... Encoder inserts nothing into bitstream | |
brc_only 3 E..V....... skip_frame metadata indicates the number of missed frames before the current frame | |
-dual_gfx <int> E..V....... Prefer processing on both iGfx and dGfx simultaneously (from 0 to 2) (default off) | |
off 0 E..V....... Disable HyperEncode mode | |
on 1 E..V....... Enable HyperEncode mode and return error if incompatible parameters during initialization | |
adaptive 2 E..V....... Enable HyperEncode mode or fallback to single GPU if incompatible parameters during initialization | |
-cavlc <boolean> E..V....... Enable CAVLC (default false) | |
-vcm <boolean> E..V....... Use the video conferencing mode ratecontrol (default false) | |
-idr_interval <int> E..V....... Distance (in I-frames) between IDR frames (from 0 to INT_MAX) (default 0) | |
-pic_timing_sei <boolean> E..V....... Insert picture timing SEI with pic_struct_syntax element (default true) | |
-single_sei_nal_unit <int> E..V....... Put all the SEI messages into one NALU (from -1 to 1) (default -1) | |
-max_dec_frame_buffering <int> E..V....... Maximum number of frames buffered in the DPB (from 0 to 65535) (default 0) | |
-look_ahead <boolean> E..V....... Use VBR algorithm with look ahead (default false) | |
-look_ahead_depth <int> E..V....... Depth of look ahead in number frames (from 0 to 100) (default 0) | |
-look_ahead_downsampling <int> E..V....... Downscaling factor for the frames saved for the lookahead analysis (from 0 to 3) (default unknown) | |
unknown 0 E..V....... | |
auto 0 E..V....... | |
off 1 E..V....... | |
2x 2 E..V....... | |
4x 3 E..V....... | |
-int_ref_type <int> E..V....... Intra refresh type. B frames should be set to 0. (from -1 to 65535) (default -1) | |
none 0 E..V....... | |
vertical 1 E..V....... | |
horizontal 2 E..V....... | |
slice 3 E..V....... | |
-int_ref_cycle_size <int> E..V....... Number of frames in the intra refresh cycle (from -1 to 65535) (default -1) | |
-int_ref_qp_delta <int> E..V....... QP difference for the refresh MBs (from -32768 to 32767) (default -32768) | |
-recovery_point_sei <int> E..V....... Insert recovery point SEI messages (from -1 to 1) (default -1) | |
-int_ref_cycle_dist <int> E..V....... Distance between the beginnings of the intra-refresh cycles in frames (from -1 to 32767) (default -1) | |
-profile <int> E..V....... (from 0 to INT_MAX) (default unknown) | |
unknown 0 E..V....... | |
baseline 66 E..V....... | |
main 77 E..V....... | |
high 100 E..V....... | |
-a53cc <boolean> E..V....... Use A53 Closed Captions (if available) (default true) | |
-aud <boolean> E..V....... Insert the Access Unit Delimiter NAL (default false) | |
-repeat_pps <boolean> E..V....... repeat pps for every frame (default false) |
エンコーダオプションの既定値。
FFmpeg/qsvenc_h264.c at master · FFmpeg/FFmpeg
- -b:0
- -refs:0
- -g:-1
- -bf:-1
- -qmin:-1
- -qmax:-1
- -trellis:-1
- -flags:+cgop
実行コマンド例
CBR(固定ビットレート):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 2000k -maxrate 2000k -c:a copy output.mp4
VBR(可変ビットレート):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 4000k -c:a copy output.mp4
VBR+look_ahead(可変ビットレート):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 1 -b:v 4000k -c:a copy output.mp4
CQP(固定品質指定):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -q:v 20 -c:a copy output.mp4
ニコ生のように制限ビットレートがある場合は VBR にすることで制限できる。CQP のビットレートは配信映像に依存するので使い慣れればこちらでも良い。品質指定は数値が小さいほど高ビットレートになる。
ICQ(品質指定):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -global_quality 20 -c:a copy output.mp4
ICQ+look_ahead(品質指定):ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 1 -look_ahead_depth 30 -global_quality 20 -c:a copy output.mp4
-look_aheadを有効にし-look_ahead_depthで先読みするフレーム数を指定することでフレーム毎に最適な品質を選び圧縮率を高める固定品質から可変品質になる。
ただしこの値が高いとライブ配信における遅延が指定フレーム数だけ増える。
-presetは遅くなるほどフレームの品質が上がりサイズも増える傾向にあり、veryfastとveryslowでは2倍くらい処理速度が違う。
addroi
フィルタに対応した。ffmpeg 5.1からの予定
映像の特定領域だけ品質を変える addroi
カラースペースなどの入力、出力オプションを指定する。
色の情報の扱いについて
HD未満
ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 2000k -maxrate 2000k -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m -color_range -c:a copy output.mp4
HD以上
ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 2000k -maxrate 2000k -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -c:a copy output.mp4
カラースペースなどをビットストリームフィルタで指定する。
ビットストリームフィルタのまとめ
HD未満
ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 2000k -maxrate 2000k -bsf:v h264_metadata=colour_primaries=6:transfer_characteristics=6:matrix_coefficients=6 -c:a copy output.mp4
HD以上
ffmpeg -i input -c:v h264_qsv -g 240 -look_ahead 0 -b:v 2000k -maxrate 2000k -bsf:v h264_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c:a copy output.mp4
色の情報が未指定のときはビットストリームフィルタを指定してコーデックコピーするとメタデータを付与できる。
HD未満
ffmpeg -i input -bsf:v h264_metadata=colour_primaries=6:transfer_characteristics=6:matrix_coefficients=6 -c copy output.mp4
HD以上
ffmpeg -i input -bsf:v h264_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c copy output.mp4
公式ドキュメント:FFmpeg Codecs Documentation : H264 options
hevc_qsvエンコーダの設定
Kaby Lake(第7世代)CPU以降であればhevc_qsv
エンコーダが使える。
ffmpeg -h encoder=hevc_qsv
Encoder hevc_qsv [HEVC (Intel Quick Sync Video acceleration)]: | |
General capabilities: delay hybrid | |
Threading capabilities: none | |
Supported hardware devices: qsv qsv qsv | |
Supported pixel formats: nv12 p010le p012le yuyv422 y210le qsv bgra x2rgb10le vuyx xv30le | |
hevc_qsv encoder AVOptions: | |
-async_depth <int> E..V....... Maximum processing parallelism (from 1 to INT_MAX) (default 4) | |
-preset <int> E..V....... (from 0 to 7) (default 0) | |
veryfast 7 E..V....... | |
faster 6 E..V....... | |
fast 5 E..V....... | |
medium 4 E..V....... | |
slow 3 E..V....... | |
slower 2 E..V....... | |
veryslow 1 E..V....... | |
-forced_idr <boolean> E..V....... Forcing I frames as IDR frames (default false) | |
-low_power <boolean> E..V....... enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.) (default auto) | |
-qsv_params <dictionary> E..V....... Set QSV encoder parameters as key1=value1:key2=value2:... | |
-rdo <int> E..V....... Enable rate distortion optimization (from -1 to 1) (default -1) | |
-max_frame_size <int> E..V....... Maximum encoded frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_i <int> E..V....... Maximum encoded I frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_p <int> E..V....... Maximum encoded P frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_slice_size <int> E..V....... Maximum encoded slice size in bytes (from -1 to INT_MAX) (default -1) | |
-mbbrc <int> E..V....... MB level bitrate control (from -1 to 1) (default -1) | |
-extbrc <int> E..V....... Extended bitrate control (from -1 to 1) (default -1) | |
-p_strategy <int> E..V....... Enable P-pyramid: 0-default 1-simple 2-pyramid(bf need to be set to 0). (from 0 to 2) (default 0) | |
-b_strategy <int> E..V....... Strategy to choose between I/P/B-frames (from -1 to 1) (default -1) | |
-dblk_idc <int> E..V....... This option disable deblocking. It has value in range 0~2. (from 0 to 2) (default 0) | |
-low_delay_brc <boolean> E..V....... Allow to strictly obey avg frame size (default auto) | |
-max_qp_i <int> E..V....... Maximum video quantizer scale for I frame (from -1 to 51) (default -1) | |
-min_qp_i <int> E..V....... Minimum video quantizer scale for I frame (from -1 to 51) (default -1) | |
-max_qp_p <int> E..V....... Maximum video quantizer scale for P frame (from -1 to 51) (default -1) | |
-min_qp_p <int> E..V....... Minimum video quantizer scale for P frame (from -1 to 51) (default -1) | |
-max_qp_b <int> E..V....... Maximum video quantizer scale for B frame (from -1 to 51) (default -1) | |
-min_qp_b <int> E..V....... Minimum video quantizer scale for B frame (from -1 to 51) (default -1) | |
-adaptive_i <int> E..V....... Adaptive I-frame placement (from -1 to 1) (default -1) | |
-adaptive_b <int> E..V....... Adaptive B-frame placement (from -1 to 1) (default -1) | |
-scenario <int> E..V....... A hint to encoder about the scenario for the encoding session (from 0 to 8) (default unknown) | |
unknown 0 E..V....... | |
displayremoting 1 E..V....... | |
videoconference 2 E..V....... | |
archive 3 E..V....... | |
livestreaming 4 E..V....... | |
cameracapture 5 E..V....... | |
videosurveillance 6 E..V....... | |
gamestreaming 7 E..V....... | |
remotegaming 8 E..V....... | |
-avbr_accuracy <int> E..V....... Accuracy of the AVBR ratecontrol (unit of tenth of percent) (from 0 to 65535) (default 0) | |
-avbr_convergence <int> E..V....... Convergence of the AVBR ratecontrol (unit of 100 frames) (from 0 to 65535) (default 0) | |
-skip_frame <int> E..V....... Allow frame skipping (from 0 to 3) (default no_skip) | |
no_skip 0 E..V....... Frame skipping is disabled | |
insert_dummy 1 E..V....... Encoder inserts into bitstream frame where all macroblocks are encoded as skipped | |
insert_nothing 2 E..V....... Encoder inserts nothing into bitstream | |
brc_only 3 E..V....... skip_frame metadata indicates the number of missed frames before the current frame | |
-dual_gfx <int> E..V....... Prefer processing on both iGfx and dGfx simultaneously (from 0 to 2) (default off) | |
off 0 E..V....... Disable HyperEncode mode | |
on 1 E..V....... Enable HyperEncode mode and return error if incompatible parameters during initialization | |
adaptive 2 E..V....... Enable HyperEncode mode or fallback to single GPU if incompatible parameters during initialization | |
-idr_interval <int> E..V....... Distance (in I-frames) between IDR frames (from -1 to INT_MAX) (default 0) | |
begin_only -1 E..V....... Output an IDR-frame only at the beginning of the stream | |
-load_plugin <int> E..V....... A user plugin to load in an internal session (from 0 to 2) (default hevc_hw) | |
none 0 E..V....... | |
hevc_sw 1 E..V....... | |
hevc_hw 2 E..V....... | |
-load_plugins <string> E..V....... A :-separate list of hexadecimal plugin UIDs to load in an internal session (default "") | |
-look_ahead_depth <int> E..V....... Depth of look ahead in number frames, available when extbrc option is enabled (from 0 to 100) (default 0) | |
-profile <int> E..V....... (from 0 to INT_MAX) (default unknown) | |
unknown 0 E..V....... | |
main 1 E..V....... | |
main10 2 E..V....... | |
mainsp 3 E..V....... | |
rext 4 E..V....... | |
scc 9 E..V....... | |
-tier <int> E..V....... Set the encoding tier (only level >= 4 can support high tier) (from 0 to 256) (default high) | |
main 0 E..V....... | |
high 256 E..V....... | |
-gpb <boolean> E..V....... 1: GPB (generalized P/B frame); 0: regular P frame (default true) | |
-tile_cols <int> E..V....... Number of columns for tiled encoding (from 0 to 65535) (default 0) | |
-tile_rows <int> E..V....... Number of rows for tiled encoding (from 0 to 65535) (default 0) | |
-recovery_point_sei <int> E..V....... Insert recovery point SEI messages (from -1 to 1) (default -1) | |
-aud <boolean> E..V....... Insert the Access Unit Delimiter NAL (default false) | |
-pic_timing_sei <boolean> E..V....... Insert picture timing SEI with pic_struct_syntax element (default true) | |
-transform_skip <int> E..V....... Turn this option ON to enable transformskip (from -1 to 1) (default -1) | |
-int_ref_type <int> E..V....... Intra refresh type. B frames should be set to 0 (from -1 to 65535) (default -1) | |
none 0 E..V....... | |
vertical 1 E..V....... | |
horizontal 2 E..V....... | |
slice 3 E..V....... | |
-int_ref_cycle_size <int> E..V....... Number of frames in the intra refresh cycle (from -1 to 65535) (default -1) | |
-int_ref_qp_delta <int> E..V....... QP difference for the refresh MBs (from -32768 to 32767) (default -32768) | |
-int_ref_cycle_dist <int> E..V....... Distance between the beginnings of the intra-refresh cycles in frames (from -1 to 32767) (default -1) |
エンコーダオプションの既定値。
FFmpeg/qsvenc_hevc.c at master · FFmpeg/FFmpeg
- -b:0
- -refs:0
- -g:248
- -bf:-1
- -qmin:-1
- -qmax:-1
- -trellis:-1
実行コマンド例
-gpbを無効にするとPフレームが挿入されるようになる。既定値の1だとI、Bフレームしかない。既定値のPフレームなしがよいのか判断できていない。もしかしてほかの設定が必要かも。ビットレートや品質指定はh264_qsvを参考にする。
ffmpeg -i input -c:v hevc_qsv -gpb 0 -bf 2 -refs 3 -g 240 -load_plugin hevc_hw -preset:v faster output.mp4
YUV420の10ビット深度で出力する。
ffmpeg -init_hw_device qsv=qsv_device:0 -filter_hw_device qsv_device -hwaccel qsv -hwaccel_output_format qsv -i input -vf scale_qsv=format=p010le:mode=hq -c:v hevc_qsv -profile:v main10 -c:a copy output.mp4
カラースペースなどの入力、出力オプションを指定する。
色の情報の扱いについて
HD未満
ffmpeg -i input -c:v hevc_qsv -gpb 0 -bf 2 -refs 3 -g 240 -load_plugin hevc_hw -b:v 2000k -maxrate 2000k -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m -color_range -c:a copy output.mp4
HD以上
ffmpeg -i input -c:v hevc_qsv -gpb 0 -bf 2 -refs 3 -g 240 -load_plugin hevc_hw -b:v 2000k -maxrate 2000k -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -c:a copy output.mp4
カラースペースなどをビットストリームフィルタで指定する。
ビットストリームフィルタのまとめ
HD未満
ffmpeg -i input -c:v hevc_qsv -gpb 0 -bf 2 -refs 3 -g 240 -load_plugin hevc_hw -b:v 2000k -maxrate 2000k -bsf:v hevc_metadata=colour_primaries=6:transfer_characteristics=6:matrix_coefficients=6 -c:a copy output.mp4
HD以上
ffmpeg -i input -c:v hevc_qsv -gpb 0 -bf 2 -refs 3 -g 240 -load_plugin hevc_hw -b:v 2000k -maxrate 2000k -bsf:v hevc_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c:a copy output.mp4
色の情報が未指定のときはビットストリームフィルタを指定してコーデックコピーするとメタデータを付与できる。
HD未満
ffmpeg -i input -bsf:v hevc_metadata=colour_primaries=6:transfer_characteristics=6:matrix_coefficients=6 -c copy output.mp4
HD以上
ffmpeg -i input -bsf:v hevc_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c copy output.mp4
【ご報告】ffmpeg で品質固定にしたときのビットレートと画質。2枚のグラフは同じデータです。
わかったことは、QSVエンコの品質=1はバグっている(笑) https://x.com/dtvsakuranejp/status/1566398313255284738— dtvsakuranejp (@dtvsakuranejp) September 4, 2022
公式ドキュメント:FFmpeg Codecs Documentation : HEVC Options
mjpeg_qsvエンコーダの設定
Haswell(第4世代)CPU 以降であればmjpeg_qsv
が使える。対応ピクセルフォーマットはnv12(4:2:0のこと)。-vframes, -frames:vで出力フレーム数を制限できる。-vsync 0で重複フレームを出力させなくしているがつけなくてもいいかもしれない。通常のフィルタとQSVフィルタを使い分けた例を併記。
ffmpeg -h encoder=mjpeg_qsv
-global_quality[int]
品質指定。100に近いほど大容量高画質。
既定値:80
コマンド例。フィルタを当てる順番に注意。
ffmpeg -hwaccel qsv -c:v h264_qsv -i video.mp4 -c:v mjpeg_qsv -global_quality 80 -vframes 10 -vsync 0 img-%03d.jpg
ffmpeg -hwaccel qsv -c:v h264_qsv -i video.mp4 -vf hwdownload,format=nv12,scale=1280:720,hwupload=extra_hw_frames=64 -c:v mjpeg_qsv -global_quality 80 -vframes 10 -vsync 0 img-%03d.jpg
ffmpeg -hwaccel qsv -c:v h264_qsv -i video.mp4 -vf vpp_qsv=1280:720 -c:v mjpeg_qsv -global_quality 80 -vframes 10 -vsync 0 img-%03d.jpg
通常は品質指定しなくても最適な品質を選ぶ。
ffmpeg -hwaccel qsv -c:v h264_qsv -i video.mp4 -c:v mjpeg_qsv -vsync 0 img-%03d.jpg
ハードウェア支援でデコードする例。
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -vf hwmap=derive_device=qsv,vpp_qsv=1280:720 -c:v mjpeg_qsv -vsync 0 img-%03d.jpg
デコーダを指定しない例。フィルタを当てる順番に注意。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf scale=w=1280:h=720,hwupload=extra_hw_frames=64 -c:v mjpeg_qsv -vsync 0 img-%03d.jpg
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,vpp_qsv=w=1280:h=720 -c:v mjpeg_qsv -vsync 0 img-%03d.jpg
-f dshowなどのリアルタイムで映像を入力するときにmjpeg_qsvを使ってもCPU負荷はmjpeg_qsvを使わないときと同様に高いままである。
コマンド例。
ffmpeg -rtbufsize 10MB -video_size 1280x720 -framerate 60 -f dshow -i video="SCFF DirectShow Filter" -c:v mjpeg_qsv -vsync 0 img-%03d.jpg
vp9_qsvエンコーダの設定
ffmpeg 4.3から使えるエンコーダ。
- Hardware/VAAPI – FFmpeg
- Hardware/QuickSync – FFmpeg
- FFmpeg/qsvenc_vp9.c at master · FFmpeg/FFmpeg
- media-driver/README.md at master · intel/media-driver
- media-driver/media_features.md at master · intel/media-driver
- Intel media stack on Ubuntu · Intel-Media-SDK/MediaSDK Wiki
ffmpeg -h encoder=vp9_qsv
Encoder vp9_qsv [VP9 video (Intel Quick Sync Video acceleration)]: | |
General capabilities: delay hybrid | |
Threading capabilities: none | |
Supported hardware devices: qsv qsv qsv | |
Supported pixel formats: nv12 p010le vuyx qsv xv30le | |
vp9_qsv encoder AVOptions: | |
-async_depth <int> E..V....... Maximum processing parallelism (from 1 to INT_MAX) (default 4) | |
-preset <int> E..V....... (from 0 to 7) (default 0) | |
veryfast 7 E..V....... | |
faster 6 E..V....... | |
fast 5 E..V....... | |
medium 4 E..V....... | |
slow 3 E..V....... | |
slower 2 E..V....... | |
veryslow 1 E..V....... | |
-forced_idr <boolean> E..V....... Forcing I frames as IDR frames (default false) | |
-low_power <boolean> E..V....... enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.) (default auto) | |
-qsv_params <dictionary> E..V....... Set QSV encoder parameters as key1=value1:key2=value2:... | |
-profile <int> E..V....... (from 0 to INT_MAX) (default unknown) | |
unknown 0 E..V....... | |
profile0 1 E..V....... | |
profile1 2 E..V....... | |
profile2 3 E..V....... | |
profile3 4 E..V....... | |
-tile_cols <int> E..V....... Number of columns for tiled encoding (from 0 to 32) (default 0) | |
-tile_rows <int> E..V....... Number of rows for tiled encoding (from 0 to 4) (default 0) |
実行コマンド例
ffmpeg -init_hw_device qsv=qsv -hwaccel qsv -i input -vf hwupload=extra_hw_frames=64,format=qsv -c:v vp9_qsv -async_depth 8 -low_power true -preset veryslow output.mp4
公式ドキュメント:FFmpeg Codecs Documentation : VP9 Options
vp9_qsv vs libvpx-vp9 file seek and open times : ffmpeg
av1_qsvエンコーダの設定
ffmpeg 5.2から使える予定のエンコーダ。DG2/Alchemist GPUが必要で、Arc Graphics A380、A750、A770モデルが対応する。
- oneVPL Support Added to FFMPEG for Great Streaming on Intel® GPUs
- Intel Lands An AV1 QSV Encoder In FFmpeg – Phoronix
- Compiling ffmpeg with libvpl. · Issue #2317 · m-ab-s/media-autobuild_suite · GitHub
- intel Arc GPUでHWEncode環境 – Qiita
公式ドキュメント:FFmpeg Codecs Documentation : AV1 Options
ffmpeg -h encoder=av1_qsv
Encoder av1_qsv [AV1 (Intel Quick Sync Video acceleration)]: | |
General capabilities: delay hybrid | |
Threading capabilities: none | |
Supported hardware devices: qsv qsv qsv | |
Supported pixel formats: nv12 p010le qsv | |
av1_qsv encoder AVOptions: | |
-async_depth <int> E..V....... Maximum processing parallelism (from 1 to INT_MAX) (default 4) | |
-preset <int> E..V....... (from 0 to 7) (default 0) | |
veryfast 7 E..V....... | |
faster 6 E..V....... | |
fast 5 E..V....... | |
medium 4 E..V....... | |
slow 3 E..V....... | |
slower 2 E..V....... | |
veryslow 1 E..V....... | |
-forced_idr <boolean> E..V....... Forcing I frames as IDR frames (default false) | |
-low_power <boolean> E..V....... enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.) (default auto) | |
-qsv_params <dictionary> E..V....... Set QSV encoder parameters as key1=value1:key2=value2:... | |
-b_strategy <int> E..V....... Strategy to choose between I/P/B-frames (from -1 to 1) (default -1) | |
-adaptive_i <int> E..V....... Adaptive I-frame placement (from -1 to 1) (default -1) | |
-adaptive_b <int> E..V....... Adaptive B-frame placement (from -1 to 1) (default -1) | |
-extbrc <int> E..V....... Extended bitrate control (from -1 to 1) (default -1) | |
-low_delay_brc <boolean> E..V....... Allow to strictly obey avg frame size (default auto) | |
-max_frame_size <int> E..V....... Maximum encoded frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_i <int> E..V....... Maximum encoded I frame size in bytes (from -1 to INT_MAX) (default -1) | |
-max_frame_size_p <int> E..V....... Maximum encoded P frame size in bytes (from -1 to INT_MAX) (default -1) | |
-profile <int> E..V....... (from 0 to INT_MAX) (default unknown) | |
unknown 0 E..V....... | |
main 1 E..V....... | |
-tile_cols <int> E..V....... Number of columns for tiled encoding (from 0 to 65535) (default 0) | |
-tile_rows <int> E..V....... Number of rows for tiled encoding (from 0 to 65535) (default 0) | |
-look_ahead_depth <int> E..V....... Depth of look ahead in number frames, available when extbrc option is enabled (from 0 to 100) (default 0) |
QSVデコーダを使う
ハードウェアデコードは再生時のデコードを目的としていて、最新のCPUのソフトウェアデコードよりも高速ではない。 高速化するのはすべてQSVでデコードからフィルタ、エンコード処理をするときである。さらにQSVデコードされたフレームをソフトウェアエンコードするときはGPUメモリからシステムメモリにコピーする必要があり、その結果パフォーマンスがさらに低下する。考えられる用途はCPUをなるべく使いたくなかったり、リアルタイム配信、速度を重視しない場合などである。
デコーダ一覧。対応世代はWikipediaを参照。
- h264_qsv
- mjpeg_qsv
- mpeg2_qsv
- hevc_qsv
- vc1_qsv
- vp8_qsv
- vp9_qsv
- av1_qsv(Tiger Lake、11世代以降)
デコーダオプション
- -async_depth[int]
内部並列化の深さ。大きな値ほど遅延も増える
既定値:4
範囲:1からINT_MAXまで - -gpu_copy[int]
システムメモリからGPUへコピーする。通常は無指定でもコピーする。無効にすると処理が遅くなる - 0, default:既定値
- 1, on
- 2, off
公式ドキュメント:FFmpeg Codecs Documentation : QSV Decoders
CPUをフル活用してエンコードする場合、デコードのCPU負荷を減らしその分をエンコードに使うことで速度の向上の可能性がある。
デコーダの部分についてコメントをいただいていたが、サーバのアカウント削除によりデータベースの保存が間に合わなかったのでコメントが消えてしまった。申し訳ない。
追記 2015年7月29日
デコーダも追加された。他にも HEVC、H264 も追加されている。
avcodec: Add QSV MPEG-2 video decoder :: git.videolan.org Git – ffmpeg.git/commitdiff
avcodec: Add QSV VC-1 video decoder :: git.videolan.org Git – ffmpeg.git/commitdiff
無指定だとソフトウェアデコードになるので、入力の前にデコーダを指定。
ffmpeg -c:v h264_qsv -i input
hevc の場合。
ffmpeg -c:v hevc_qsv -i input
ffplay の場合。
ffplay -codec:v h264_qsv -i input
デコーダはffmpeg -decoders > decoders.txt
で一覧をテキストで見ることができる。
QSV フィルタを使う
ffmpeg 3.3 からデインターレーサとリサイザが追加された。ただし ffmpeg で使えても ffplay では使えないのでプレビュー用途なら標準出力して ffplay に渡す。また入力ファイルに応じて QSV デコーダを使わないと QSV フィルタが使えない。-filter_hw_device qsvとhwupload
フィルタでフレーム数を増やせば QSV デコーダを使わなくてもよい。ffmpeg 4.0 以降はフィルタのhwdownload,format=nv12
が不要になり付けない方が高速になった。ただし例外が2つあり普通のフィルタに切り替えるときはhwdownload,format=nv12
を挟み、ソフトウェアエンコーダを使うときはフィルタの最後にhwdownload,format=nv12
をつける。
使えるフィルタ一覧
- vpp_qsv(3.4以降)
- scale_qsv(3.3以降)は、vpp_qsvに統合(6.0以降)
- overlay_qsv(4.0以降)
- deinterlace_qsv(3.4以降)
。procampを有効にすると使える。これらのフィルタは公式ドキュメントに記載がないのでコマンドからオプション内容を調べる。vpp_qsv
フィルタは第3世代の Intel Core シリーズでは一部が使えてない
ffmpeg -h filter=vpp_qsv > vpp_qsv.txt
コマンド例は2つあり1行目が QSV のデコード、フィルタ、エンコードを併用し、2行目が QSV フィルタだけ当てている。
リサイズ。
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf hwupload=extra_hw_frames=10,vpp_qsv=w=1280:h=720 -c:v h264_qsv -g 240 -q:v 20 -c:a copy output.mp4
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input.mp4 -vf hwupload=extra_hw_frames=10,vpp_qsv=w=1280:h=720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4
デインターレース(bob になる)。QSV のデコードとインターレース解除を併用すると映像が乱れるのでコマンド例がない。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -fflags +discardcorrupt -analyzeduration 30M -probesize 30M -i input.ts -vf hwupload=extra_hw_frames=64,deinterlace_qsv,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4
TS ファイルをデインターレースとリサイズし、重複フレームを間引く(30p)。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -fflags +discardcorrupt -analyzeduration 30M -probesize 30M -i input.ts -vf hwupload=extra_hw_frames=64,deinterlace_qsv,vpp_qsv=w=1280:h=720,hwdownload,format=nv12,fps=30000/1001 -c:v libx264 -c:a copy output.mp4
TS ファイルをデインターレースとリサイズし、重複フレームを間引く(30p->24p)。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -fflags +discardcorrupt -analyzeduration 30M -probesize 30M -i input.ts -vf hwupload=extra_hw_frames=64,deinterlace_qsv,vpp_qsv=w=1280:h=720,hwdownload,format=nv12,fps=30000/1001,decimate -r 24000/1001 -c:v libx264 -c:a copy output.mp4
動画に動画をオーバーレイ。
ffmpeg -hwaccel qsv -c:v h264_qsv -i bgv.mp4 -c:v h264_qsv -i overlay.mp4 -filter_complex [0:v]hwupload=extra_hw_frames=10[0v];[1:v]hwupload=extra_hw_frames=10,[0v]overlay_qsv -c:v h264_qsv -q:v 20 -c:a copy output.mp4
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i bgv.mp4 -i overlay.mp4 -filter_complex [0:v]hwupload=extra_hw_frames=10[0v];[1:v]hwupload=extra_hw_frames=10,[0v]overlay_qsv -c:v libx264 -c:a copy output.mp4
画像をオーバーレイ。
ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i bgv.mp4 -loop 1 -i overlay.png -filter_complex "[0:v]format=nv12,hwupload=extra_hw_frames=10[0v];[1:v] format=nv12,hwupload=extra_hw_frames=10[1v];[0v][1v]overlay_qsv" -c:v libx264 -c:a copy output.mp4
DXVA デコーダを使って、QSV フィルタとエンコードを併用。
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input.mp4 -vf hwmap=derive_device=qsv,vpp_qsv=w=1280:h=720 -c:v h264_qsv -g 240 -c:a copy output.mp4
Sorry to violating “日本語が含まれない投稿は無視されますのでご注意ください” below, I can read a little にほんご but I can’t write it with confident.
Thanks for your detailed guide on using qsv filters, that helped me a lot to get FFMPEG+QuickSync working
Just a friendly sharing for utilizing QSV with Decoding+Scale+Encoding, we can now remove “hwdownload,format=nv12″ in video filter, like this sample on using scale_qsv
ffmpeg -hwaccel qsv -vcodec h264_qsv -i input.mp4 -vf scale_qsv=1280:720 -fflags +discardcorrupt -vcodec h264_qsv -look_ahead 0 -q:v 20 -acodec copy out.mp4
As a result, the h264_qsv(input decoder) will result video in pix_fmt=”qsv”, that doesn’t require hwdownload and convert to NV12 but go to the h264_qsv(output encoder) directly, the performance increase will be significant. Only worked on FFMPEG 4.0 and after.
Thank you for your usefull information!
[…] ハードウェアビデオアクセラレーション – ArchWiki […]