更新されたまとめ記事があります

Intel QSVによる動画エンコーディングを試してみた。

LinuxにおいてIntel QSVはVA-APIを通して利用することができる。 そのため、FFmpegのVA-API機能を使用してエンコードしてみる。

VP9 WebM。

おおよそ基本的なフォーマットに従っているけれども、注意点は-vfオプションだろう。

これはビデオフィルタを指定するのだが、この中でscale_vaapiは動画の画像サイズ(よく解像度と言われるもの)を変更している。 これは、ソフトウェアエンコーディングのものと比べ柔軟性が劣るため、スクリプトで連続処理する場合はよく考えて設定する必要がある。 特にアスペクト比が一定でない場合は注意が必要。

VP9でconstant qualityエンコーディングしたいと考えたのだけど、結局まともな結果は得られなかった。 -qだろうが-qpだろうが、設定は基本的に無視される(もちろん、-b:v 0しているのだけど)。

H.265の動画を作る。

そして、-qp 32のH.265なMP4と、-b:v 2.5MのVP9なWebMの比較が次の通り。

-rw-r--r-- 1 aki aki  43215798  1月 24 14:27 _comp_fuwa.mp4
-rw-r--r-- 1 aki aki  43365795  1月 24 14:30 _comp_fuwa.webm

VP9は非常に荒れている
VP9 2.5Mbps キャプチャ

H.265は良好な画質
H.265 2.5Mbps (qp=32)

VP9のほうは、とても見られたものではない。 オリジナルは171484771バイトのH.264 MP4であるが、

encoder         : Lavf57.25.100
  Duration: 00:02:14.08, start: 0.000000, bitrate: 10231 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/unknown/smpte170m), 1080x1920 [SAR 1:1 DAR 9:16], 9942 kb/s, 29.88 fps, 29.88 tbr, 15296 tbn, 59.75 tbc (default)

H.265のほうがなんら問題なく見られるのに対して、VP9のほうはちょっと実用に耐えない。 フリーのコーデックを使いたいという気持ちは強いので、何度も実験しているのだけれども、今のところ「高圧縮のH.265並の圧縮度を求めるとひどい結果になる」という結論しか得られていない。

そもそも(VP10が合流した)AV1が「HEVCに迫る」なんて言っている状況を鑑みればそんなものなのかもしれない。 AV1はまだavcodecには載っていないので、WebM勢は遅れが目立ち、このままではWeb配信のみのフォーマットになってしまいそうだ。

WebPが後発のHEIFに飲み込まれそうな情勢を考えても、世界はライセンス問題という頭痛の種をなんとかしようという方向には進まないらしい。

個人的に所蔵するデータについては、恐らくおとなしくH.265/MP4にするのが無難だろう。 公開・配布する場合はVP9も選択肢に入るだろうし、その場合はIntel QSVでエンコードできるのは非常に嬉しいだろう。1

先日のNVENCを使用する方法(Nvidia版, H.264)は次のようなものだった。 どちらかといえばVA-APIにして欲しいなぁ…


  1. 自分で所蔵する(オリジナルになる)特別な動画データなら時間をかけても構わないが、一時的な自分ではあまり使わないデータであれば瞬間で終わってほしいと思うのが人情だろう。

3 Replies to “Intel QSV * Linux * FFmpeg * (H.265|VP9)”

    1. libx265であれば-crfは利用可能ですが、VAAPIでのエンコード時には利用できないオプションです。

      FFMpeg公式の記述を見ると、VAAPIをデコードにのみ使っている場合、
      つまりソフトウェアエンコーダの場合には(libx264を指定しています)-crfを使用していますが、
      ハードウェアエンコーダを指定している場合には使用していないのがわかるかと思います。

      実際にドキュメントが十分に存在しないVAAPI_VP9エンコーダで-crfオプションのみを指定して比較してみましたが、
      以下の通り全く同じ結果となっています。

      % ffmpeg -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i V_20180424_120956_vHDR_Auto_N0.mp4 -vf 'format=nv12|vaapi,hwupload' -c:v vp9_vaapi -c:a libopus -crf 20 crf20.webm
      ...
      % ffmpeg -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i V_20180424_120956_vHDR_Auto_N0.mp4 -vf 'format=nv12|vaapi,hwupload' -c:v vp9_vaapi -c:a libopus -crf 40 crf40.webm
      ...
      % ffprobe crf20.webm 
      ffprobe version 3.4.2 Copyright (c) 2007-2018 the FFmpeg developers
        built with gcc 7.3.0 (GCC)
        configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-shared --enable-version3 --enable-omx
        libavutil      55. 78.100 / 55. 78.100
        libavcodec     57.107.100 / 57.107.100
        libavformat    57. 83.100 / 57. 83.100
        libavdevice    57. 10.100 / 57. 10.100
        libavfilter     6.107.100 /  6.107.100
        libavresample   3.  7.  0 /  3.  7.  0
        libswscale      4.  8.100 /  4.  8.100
        libswresample   2.  9.100 /  2.  9.100
        libpostproc    54.  7.100 / 54.  7.100
      Input #0, matroska,webm, from 'crf20.webm':
        Metadata:
          COM.ANDROID.VERSION: 7.1.1
          MAJOR_BRAND     : mp42
          MINOR_VERSION   : 0
          COMPATIBLE_BRANDS: isommp42
          ENCODER         : Lavf57.83.100
        Duration: 00:01:58.32, start: -0.007000, bitrate: 90378 kb/s
          Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, progressive), 1080x1920, SAR 1:1 DAR 9:16, 59 fps, 59 tbr, 1k tbn, 1k tbc (default)
          Metadata:
            ENCODER         : Lavc57.107.100 vp9_vaapi
            HANDLER_NAME    : VideoHandle
            DURATION        : 00:01:58.295000000
          Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
          Metadata:
            HANDLER_NAME    : SoundHandle
            ENCODER         : Lavc57.107.100 libopus
            DURATION        : 00:01:58.322000000
      % ffprobe crf40.webm
      ffprobe version 3.4.2 Copyright (c) 2007-2018 the FFmpeg developers
        built with gcc 7.3.0 (GCC)
        configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-shared --enable-version3 --enable-omx
        libavutil      55. 78.100 / 55. 78.100
        libavcodec     57.107.100 / 57.107.100
        libavformat    57. 83.100 / 57. 83.100
        libavdevice    57. 10.100 / 57. 10.100
        libavfilter     6.107.100 /  6.107.100
        libavresample   3.  7.  0 /  3.  7.  0
        libswscale      4.  8.100 /  4.  8.100
        libswresample   2.  9.100 /  2.  9.100
        libpostproc    54.  7.100 / 54.  7.100
      Input #0, matroska,webm, from 'crf40.webm':
        Metadata:
          COM.ANDROID.VERSION: 7.1.1
          MAJOR_BRAND     : mp42
          MINOR_VERSION   : 0
          COMPATIBLE_BRANDS: isommp42
          ENCODER         : Lavf57.83.100
        Duration: 00:01:58.32, start: -0.007000, bitrate: 90378 kb/s
          Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, progressive), 1080x1920, SAR 1:1 DAR 9:16, 59 fps, 59 tbr, 1k tbn, 1k tbc (default)
          Metadata:
            ENCODER         : Lavc57.107.100 vp9_vaapi
            HANDLER_NAME    : VideoHandle
            DURATION        : 00:01:58.295000000
          Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
          Metadata:
            HANDLER_NAME    : SoundHandle
            ENCODER         : Lavc57.107.100 libopus
            DURATION        : 00:01:58.322000000
      

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください