apple siliconのffmpegでh265 (hevc)にハードウェアエンコードしてQuicktime Player.appで再生するまで

準備

zsh

デフォルトで入ってると思う

%echo $SHELL
/bin/zsh

commnadline tool導入

xcode-select --install

ここからdmgを落としてもOKらしい developer.apple.com

homebrew導入

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

docs.brew.sh

% brew -v
Homebrew 4.0.9

ffmpeg導入

brew install ffmpeg

どうもデフォでapple siliconを判別してハードウェアエンコード用ツールがついてくるらしい
ありがたい… formulae.brew.sh

% ffmpeg -version
ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 14.0.0 (clang-1400.0.29.202)

入力ファイルの確認

ffproveで中身を見る

% ffprove input.mp4

このときStream: Video:の先にyuv420p表記があればまず問題ない もしyuv422pとかだったら次の段階で-pix_fmt yuv420pをつける videotech.densan-labs.net

出力ファイルの設定

 ffmpeg -i input.mp4 -c:v hevc_videotoolbox -tag:v hvc1 output.mp4

注意点

  • h265_videotoolboxではない,hevc_videotoolbox
    • 古い記事でたまにそう書いてあるものがあるかもしれん
    • ちなみにh264_videotoolboxは存在する,なぜなのか
    • 厳密にh265/hevcはそれぞれ同じ(規格の掲載元がituかisoかの違い)じゃなかったっけ?だったらそっちもh264/avcに揃えたら?などと思ったが後方互換を考えると地獄かもしれない,いやじゃあなんでh265からhevcに変えたんだよと尚更ツッコミたくなる
  • -tag:v hvc1をつけないとApple系Appでは再生できない
    • 中身が同じもダメ
    • Quicktime Player.appだけではなく写真.appもダメっぽい luxion.jp

Finderのプレビューも

たぶんQuicktime Player.appと同じバイナリを使ってるのか

yuv220pのワーニングについて

おそらくはエンコード開始の直前に下記のメッセージが出る

Color range not set for yuv420p. Using MPEG range.

詳細は不明,-pix_fmt yuv420pをつけても出るので知らん

M1 Maxのハードウェアエンコードが強い理由

やってみたらx265ライブラリ(CPU処理)より10倍ほど爆速だった,使用しない理由がない
そしてM1 にはメディアエンジンがなく,もしくはM1 Proにはメディアエンジンこそあるものの,M1 maxはメディアエンジンをその2倍の規模で搭載している
Apple siliconにおけるメディア(ビデオ)エンコードはもうCPUやGPUだけでは差がつかない www.itmedia.co.jp ちなみにM2にはM1と違ってメディアエンジンがある,しかしM2 ProはM2と同じ規模だし,M2 Maxになってようやく2倍になる(これはM1シリーズと同じ) www.itmedia.co.jp www.itmedia.co.jp そう考えると価格崩壊し始めたApple認定整備済品M1 Maxはマジでお得でしかない,買え