MacのKdenliveでlibsvtav1(SVT-AV1)を使う

Posted on Mar 25, 2024

超優秀なAV1エンコーダーをMacのKdenliveで使おうと試行錯誤した結果です。

環境

M2 Mac mini (macOS 14.4 - Homebrewインストール済み)

そもそもの話

なんで一部のLinuxディストリビューションだとエンコーダーにlibsvtav1が指定できるのにWindowsやらMacだとできないんだという話ですが、これはエンコードを行なっている本体であるMeltのビルドオプションが原因です。
ffmpegのようにビルドオプション次第で使えるエンコーダーが変わります。aptやらdnfやらを使っているLinux環境ではこのmeltは依存関係として公式のパッケージリポジトリから自動的にインストールされます。
つまりディストリビューションのリポジトリのパッケージ管理人がビルドオプションで--enable-libsvtav1みたいなオプションを付けていればMeltはSVT-AV1でエンコードできるようになる訳です。
macOS環境ではMeltはKdenlive本体に同梱されているものをデフォルトで使用します。残念なことにこの同梱されているMeltは(恐らくビルドオプションの関係で)libsvtav1をエンコーダーに指定することができません。

つまりKdenliveにenable-libsvtav1なMeltを使わせれば全て解決する訳です。

SVT-AV1を使えるMeltをインストールする

自力でビルドする必要があるかと思ってましたがありがたいことにbrew install mltでインストールされるMeltはちゃんとlibsvtav1が有効になった状態で配布されています。
そしてKdenliveにはツールバーのKdenlive→Preferenes→Environmentに使用するMeltのパスを設定する項目があります。

KdenliveにHomebrewでインストールしたMelt(/opt/homebrew/bin/melt)を使わせればめでたくSVT-AV1でレンダリングできるようになります。やったね!

M1以降の環境だと追加の手順が必要

設定項目は確かに存在しますが、これには罠があります。実はKdenliveはM1などのArmアーキテクチャのCPUに対応していません。Rosettaを使って動いている訳ですがRosettaからArmで動くMeltのバイナリを呼び出すことはできません。ArmなMacでこの設定項目を/opt/homebrew/下のものにしても起動時にフォールバックして元に戻ってしまいます。若干めんどくさいですがレンダリングスクリプトを吐かせて手動でmltコマンドを呼び出してレンダリングすることで解決します。

Step1: レンダリングスクリプトを保存

内臓のMeltでも扱えるコーデックをとりあえずダミーで指定してレンダリングスクリプトを吐かせます。
以下の内容の仮のレンダリングプロファイルを作成します。

ab=%audiobitrate+'k' acodec=libopus ar=48000 channels=2 crf=30 f=webm strict=experimental vcodec=libaom-av1

適当な名前で保存し選択した状態で"Generate Script"をクリックします。名前を聞かれるので適当に入力して保存します。

Step2: 手動でレンダリング

~/Movies/kdenlive-renderqueueにそれっぽい名前で拡張子が.mltのファイルが入っていると思います。
適当なテキストエディターで該当ファイルを開き仮に指定したlibaom-av1libsvtav1に置き換えます。

 <consumer f="webm" channels="2" crf="30" target="/Users/nexryai/Movies/3.25.webm" mlt_service="avformat" ar="48000" real_time="-1" threads="2" ab="0k" vcodec="libaom-av1" strict="experimental" acodec="libopus" in="0" out="10752"/>

↓↓↓

 <consumer f="webm" channels="2" crf="30" target="/Users/nexryai/Movies/3.25.webm" mlt_service="avformat" ar="48000" real_time="-1" threads="2" ab="0k" vcodec="libsvtav1" strict="experimental" acodec="libopus" in="0" out="10752"/>

ターミナルを開いて手動でmltコマンドを呼び出してレンダリングします。

nexryai@M2-Mini ~ % /opt/homebrew/bin/melt -progress <PATH_TO_MLT_FILE>

まとめ

最近のMacは全部Armなのでいい加減KdenliveさんはApple Siliconに対応してください。お願いします。