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
相当? 未確認)品質が期待できます。
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
)にするようエラーが。有効にしても、何かのパラメータが正しくないとのエラーが表示されて成功しませんでした。