cBlog

Tips for you.

ffmpegでMacのハードウェアアクセラレーションを使う

スポンサーリンク
※当ブログのAmazon、iTunes、サウンドハウス等のリンクはアフィリエイトを利用しています。

ffmpeg ロゴ

ffmpegのエンコードにMacのハードウェア支援を使えることを知ったので比較してみます。VideoToolboxとAudioToolboxというフレームワークからアクセスできます。VideoToolboxではH.264とHEVC/H.265が、AudioToolboxではAACが利用できます。

[追記 2022/02/11] ffmpeg 5.0よりApple ProResやALAC (Apple Lossless Audio Codec)も利用できるようになりました。ilbcやpcm系は、よくわかりません。

% ffmpeg -hide_banner -encoders | grep -i toolbox
 V....D h264_videotoolbox    VideoToolbox H.264 Encoder (codec h264)
 V....D hevc_videotoolbox    VideoToolbox H.265 Encoder (codec hevc)
 V....D prores_videotoolbox  VideoToolbox ProRes Encoder (codec prores)
 A..... aac_at               aac (AudioToolbox) (codec aac)
 A..... alac_at              alac (AudioToolbox) (codec alac)
 A..... ilbc_at              ilbc (AudioToolbox) (codec ilbc)
 A..... pcm_alaw_at          pcm_alaw (AudioToolbox) (codec pcm_alaw)
 A..... pcm_mulaw_at         pcm_mulaw (AudioToolbox) (codec pcm_mulaw)

 

環境

  • Intel Core-i9 9880H 2.3 GHz
  • 32 GB RAM
  • AMD Radeon Pro 5500M 8 GB
  • macOS 11.6 Big Sur
% ffmpeg -version
ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 12.0.5 (clang-1205.0.22.9)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
libavutil      56. 70.100 / 56. 70.100
libavcodec     58.134.100 / 58.134.100
libavformat    58. 76.100 / 58. 76.100
libavdevice    58. 13.100 / 58. 13.100
libavfilter     7.110.100 /  7.110.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  9.100 /  5.  9.100
libswresample   3.  9.100 /  3.  9.100
libpostproc    55.  9.100 / 55.  9.100

 

テストソース

% ffmpeg -hide_banner -i 00002.ts
Input #0, mpegts, from '00002.ts':
  Duration: 00:04:07.29, start: 0.004000, bitrate: 21616 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
  Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Side data:
      cpb: bitrate max/min/avg: 24000000/0/0 buffer size: 9781248 vbv_delay: N/A
  Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 191 kb/s
At least one output file must be specified

ハードウェア支援を使用時は品質指定ができません。ビデオは4倍程度の6000 kbps、音声は軽く128 kbpsに圧縮することにします。

 

ビデオ

H.264エンコーダオプション

% ffmpeg -hide_banner -h encoder=h264_videotoolbox
Encoder h264_videotoolbox [VideoToolbox H.264 Encoder]:
    General capabilities: delay
    Threading capabilities: none
    Supported pixel formats: videotoolbox_vld nv12 yuv420p
h264_videotoolbox AVOptions:
  -profile           <int>        E..V....... Profile (from 0 to 5) (default 0)
     baseline        1            E..V....... Baseline Profile
     main            2            E..V....... Main Profile
     high            3            E..V....... High Profile
     extended        4            E..V....... Extend Profile
  -level             <int>        E..V....... Level (from 0 to 52) (default 0)
     1.3             13           E..V....... Level 1.3, only available with Baseline Profile
     3.0             30           E..V....... Level 3.0
     3.1             31           E..V....... Level 3.1
     3.2             32           E..V....... Level 3.2
     4.0             40           E..V....... Level 4.0
     4.1             41           E..V....... Level 4.1
     4.2             42           E..V....... Level 4.2
     5.0             50           E..V....... Level 5.0
     5.1             51           E..V....... Level 5.1
     5.2             52           E..V....... Level 5.2
  -coder             <int>        E..V....... Entropy coding (from 0 to 2) (default 0)
     cavlc           1            E..V....... CAVLC entropy coding
     vlc             1            E..V....... CAVLC entropy coding
     cabac           2            E..V....... CABAC entropy coding
     ac              2            E..V....... CABAC entropy coding
  -a53cc             <boolean>    E..V....... Use A53 Closed Captions (if available) (default true)
  -allow_sw          <boolean>    E..V....... Allow software encoding (default false)
  -require_sw        <boolean>    E..V....... Require software encoding (default false)
  -realtime          <boolean>    E..V....... Hint that encoding should happen in real-time if not faster (e.g. capturing from camera). (default false)
  -frames_before     <boolean>    E..V....... Other frames will come before the frames in this session. This helps smooth concatenation issues. (default false)
  -frames_after      <boolean>    E..V....... Other frames will come after the frames in this session. This helps smooth concatenation issues. (default false)

 

H.264ソフトウェアエンコード

1.97xでした。

% ffmpeg -hide_banner -i 00002.ts -c:v libx264 -b:v 6000k -an libx264.mp4
...
frame= 7408 fps= 59 q=-1.0 Lsize=  182034kB time=00:04:07.08 bitrate=6035.4kbits/s speed=1.97x
...

 

H.264ハードウェアエンコード

7.85xでした。ソフトウェアエンコードの4.0倍の速さでエンコードできることになります。

% ffmpeg -hide_banner -i 00002.ts -c:v h264_videotoolbox -b:v 6000k -an h264_videotoolbox.mp4
...
frame= 7408 fps=235 q=-0.0 Lsize=  181208kB time=00:04:07.11 bitrate=6007.2kbits/s speed=7.85x
...

 

HEVCエンコーダオプション

% ffmpeg -hide_banner -h encoder=hevc_videotoolbox
Encoder hevc_videotoolbox [VideoToolbox H.265 Encoder]:
    General capabilities: delay hardware
    Threading capabilities: none
    Supported pixel formats: videotoolbox_vld nv12 yuv420p bgra p010le
hevc_videotoolbox AVOptions:
  -profile           <int>        E..V....... Profile (from 0 to 3) (default 0)
     main            1            E..V....... Main Profile
     main10          2            E..V....... Main10 Profile
  -alpha_quality     <double>     E..V....... Compression quality for the alpha channel (from 0 to 1) (default 0)
  -allow_sw          <boolean>    E..V....... Allow software encoding (default false)
  -require_sw        <boolean>    E..V....... Require software encoding (default false)
  -realtime          <boolean>    E..V....... Hint that encoding should happen in real-time if not faster (e.g. capturing from camera). (default false)
  -frames_before     <boolean>    E..V....... Other frames will come before the frames in this session. This helps smooth concatenation issues. (default false)
  -frames_after      <boolean>    E..V....... Other frames will come after the frames in this session. This helps smooth concatenation issues. (default false)

 

HEVCソフトウェアエンコード

0.637x。非常に遅いです。

% ffmpeg -hide_banner -i 00002.ts -c:v libx265 -tag:v hvc1 -b:v 6000k -an libx265.mp4
...
frame= 7408 fps= 19 q=22.8 Lsize=  183447kB time=00:04:07.08 bitrate=6082.2kbits/s speed=0.637x
...

 

HEVCハードウェアエンコード

5.24x。再生時間以下になりましたし、ソフトウェアエンコードの8.2倍も速度が出ます。

% ffmpeg -hide_banner -i 00002.ts -c:v hevc_videotoolbox -tag:v hvc1 -b:v 6000k -an hevc_videotoolbox.mp4
...
frame= 7408 fps=157 q=-0.0 Lsize=  181376kB time=00:04:07.08 bitrate=6013.6kbits/s speed=5.24x
...

 

オーディオ

音声にハードウェアエンコードを使う人はあまりいないと思いますが、評判の高いApple謹製AACエンコーダなので(afconvert相当? 未確認)品質が期待できます。

yaritakunai.hatenablog.com

 

AACエンコーダオプション

Supported sample formats: s16までというのが気になります(あとで検証します)。

% ffmpeg -hide_banner -h encoder=aac_at
Encoder aac_at [aac (AudioToolbox)]:
    General capabilities: dr1 delay
    Threading capabilities: none
    Supported sample formats: s16 u8
    Supported channel layouts: mono stereo 3.0 4.0 5.0(side) 5.1(side) 6.0 6.1 7.0 7.1(wide) quad octagonal
at_aac_enc AVOptions:
  -aac_at_mode       <int>        E...A...... ratecontrol mode (from -1 to 3) (default auto)
     auto            -1           E...A...... VBR if global quality is given; CBR otherwise
     cbr             0            E...A...... constant bitrate
     abr             1            E...A...... long-term average bitrate
     cvbr            2            E...A...... constrained variable bitrate
     vbr             3            E...A...... variable bitrate
  -aac_at_quality    <int>        E...A...... quality vs speed control (from 0 to 2) (default 0)

 

AACソフトウェアエンコード

95xでした。

% ffmpeg -hide_banner -i 00002.ts -vn -c:a aac -b:a 128k aac.mp4
...
size=    3909kB time=00:04:07.26 bitrate= 129.5kbits/s speed=  95x
...

 

AACハードウェアエンコード

85.4x。遅くなってしまいました。

% ffmpeg -hide_banner -i 00002.ts -vn -c:a aac_at -b:a 128k aac_at.mp4
...
size=    3897kB time=00:04:07.28 bitrate= 129.1kbits/s speed=85.4x
...

 

サンプルフォーマット

verboseで実行してみると、あらかじめ16 bit intに変換されているようです。これでは丸め誤差が発生してしまう(場合がある)ので品質は期待できません。現状では使うことはないでしょう。

[auto_resampler_0 @ 0x7fe3cfc05380] ch:2 chl:stereo fmt:fltp r:48000Hz -> ch:2 chl:stereo fmt:s16 r:48000Hz

 

追記 2022/02/11

Apple ProResのハードウェアエンコーディングを試してみます。

 

環境

変更点のみ書きます。

  • macOS 12.2.1 Monterey
% ffmpeg -version
ffmpeg version 5.0 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.3)
configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil      57. 17.100 / 57. 17.100
libavcodec     59. 18.100 / 59. 18.100
libavformat    59. 16.100 / 59. 16.100
libavdevice    59.  4.100 / 59.  4.100
libavfilter     8. 24.100 /  8. 24.100
libswscale      6.  4.100 /  6.  4.100
libswresample   4.  3.100 /  4.  3.100
libpostproc    56.  3.100 / 56.  3.100

 

テストソース

テストソースがわからなくなってしまったので比較は保留です。

 

ffmpegのProResエンコーダ

VideoToolboxのほかに3種類(proresとprores_awは同じらしいので実際は2種類)あります。

% ffmpeg -hide_banner -encoders | grep prores
 VF.... prores               Apple ProRes
 VF.... prores_aw            Apple ProRes (codec prores)
 VFS... prores_ks            Apple ProRes (iCodec Pro) (codec prores)
 V....D prores_videotoolbox  VideoToolbox ProRes Encoder (codec prores)

 

Apple ProResエンコーダオプション

% ffmpeg -hide_banner -h encoder=prores_videotoolbox
Encoder prores_videotoolbox [VideoToolbox ProRes Encoder]:
    General capabilities: dr1 delay hardware
    Threading capabilities: none
    Supported pixel formats: videotoolbox_vld yuv420p nv12 ayuv64le uyvy422 p010le nv16 p210le p216le nv24 p410le p416le bgra
prores_videotoolbox AVOptions:
  -profile           <int64>      E..V....... Profile (from -99 to 5) (default auto)
     auto                         E..V....... Automatically determine based on input format
     proxy                        E..V....... ProRes 422 Proxy
     lt                           E..V....... ProRes 422 LT
     standard                     E..V....... ProRes 422
     hq                           E..V....... ProRes 422 HQ
     4444                         E..V....... ProRes 4444
     xq                           E..V....... ProRes 4444 XQ
  -allow_sw          <boolean>    E..V....... Allow software encoding (default false)
  -require_sw        <boolean>    E..V....... Require software encoding (default false)
  -realtime          <boolean>    E..V....... Hint that encoding should happen in real-time if not faster (e.g. capturing from camera). (default false)
  -frames_before     <boolean>    E..V....... Other frames will come before the frames in this session. This helps smooth concatenation issues. (default false)
  -frames_after      <boolean>    E..V....... Other frames will come after the frames in this session. This helps smooth concatenation issues. (default false)

 

ProResエンコードを試す

早速試してみたのですが、いきなりソフトウェアエンコーディングを有効(-allow_sw 1)にするようエラーが。有効にしても、何かのパラメータが正しくないとのエラーが表示されて成功しませんでした。