ハードウェアエンコードを用いてオフラインで高速変換される動画変換アプリ「Vencode」を開発しました。
機能に関する説明は次の記事にあります。
開発のきっかけとしては、Discordに動画ファイルをアップロードする際によくファイルサイズ制限に引っかかったことです。
解像度などを変換するにもCPU処理で時間がかかったり、大容量な動画ファイルをアップロードする必要がありました。
そこで、ハードウェアエンコードを活用してローカルで完結させることで、高速かつデータ使用量を使わない変換アプリを開発しました。
Androidにおける動画変換の選択肢
動画変換の方法として以下を検討しました。
- Media3 Transformer
- WebCodecs
- FFmpegをサーバで実行
Media3 Transformer
Media3 Transformerとは、Jetpack Media3というGoogle公式ライブラリに含まれるAPIです。
ハードウェアアクセラレーションを用いた変換に対応しています。
Android向けのライブラリであり、Androidアプリとして実装する必要があります。
WebCodecs
WebCodecsとは、ブラウザからエンコーダ・デコーダを低レベルで扱えるJavaScript APIです。
Webアプリとして実装できるためインストールは不要ですが、ブラウザや端末によって利用可能なコーデックが異なり、ブラウザの実行環境による制約もあります。
FFmpegをサーバで実行
端末の負荷が最も小さく、端末より高性能なサーバで高速に変換できます。
重い処理になるためサーバ代がかかったり、プライバシーの懸念もあります。
Media3 Transformerを選んだ理由
個人開発のため運用コストは可能な限り小さくしたいです。
そのため、FFmpegをサーバで実行する案は却下しました。
WebCodecsはブラウザごとの対応状況や実行環境の制約を考慮する必要があり、AIの進歩によってAndroidアプリの開発が容易になったことから、AndroidのMediaCodecを利用したハードウェアアクセラレーションによって、高速な変換が期待できるMedia3 Transformerを選定しました。
実装上の問題
AV1のハードウェアエンコードができない
検証した複数の端末でAV1のハードウェアエンコードが利用できなかったため、現状のVencodeではAV1の変換にソフトウェアエンコードを使用しています。
非常に低速であるため、 Av1an のように動画を分割して並列エンコードする手法などを参考に、改善していきたいです。
まとめ
代表的な解像度・フレームレート・コーデックであればMedia3 Transformerで簡単に高速な変換を実装できます。
クライアント側で変換を行えば、サーバの負荷を減少させられます。
しかし、AV1のような新しいコーデックでは対応していない場合があるため、その際のフォールバックには注意しなくてはなりません。