ffmpeg で高速低負荷な Hap コーデックの動画に変換する

動画のイメージ。

Hap コーデックは(CPU が)低負荷で高速に再生(でコード)できるコーデックです。 ffmpeg を使って、異なるコーデックの動画を Hap コーデックに変換する方法についてまとめておきます。

ここでは主に Windows 環境のみについて紹介していますが、利用方法は概ね一緒です。

Hap コーデックに関して

Presenting Hap, a family of open-source GPU accelerated video codecs」 に Hap コーデックについてまとめてあります。 VDMX は有名な VJ ツールです。掲載情報については十分検討されているでしょう。概ね次の通りです。

  • 高速に(低負荷に)再生することができる
  • GPU への転送が容易である
  • ビットレートが大きくなる(ファイルサイズが大きくなる)

低圧縮であるものの(ファイルサイズが大きくなるものの)、高速に再生できるという認識で良いと思います。

(CPU が)軽負荷な理由は、GPU に直接圧縮されたデータを送り、GPU でデコードするためのようです。 また SSD の利用を推奨しています。特に高解像度の動画ファイルになると、ファイルの読み込みの方で追いつかなくなる可能性があるためでしょう。 (一般的な解像度なら問題ないのでしょうが)

画質について

Hap エンコード時の画質の変化。

べた塗りのようなノッペリした絵では圧縮時のノイズが見えます。アルゴリズムが定かではないですが、複雑な絵の方が適しているといえます。 画像形式で言うところの jpeg と png のようなものですかね(jpeg は写真などの複雑な絵の方が向いています)。

とはいえ拡大してこのレベルですし、高速に再生する必要がある環境においては妥協の範囲かと思います。速度や圧縮率とトレードオフの機能ですしね。

ファイルサイズについて

手元で適当な動画を変換したところ次のようになりました。概ね 30 倍くらいに膨れ上がりますね。

コーデック解像度再生時間ファイルサイズ変換後のファイルサイズ
H.2644K06:020.98 GB33.7 GB
H.2644K02:24382 MB11.2 GB

再生環境について

手元に Mac 環境がないので試験することができませんが、Mac だと概ね動くんでしょうかね ? 他に、VDMX で再生したり、 Windows では「TouchDesigner」「OpenFrameworks(ofxHapPlayer)」「Jitter(jit.gl.hap)」などで再生することができるようです。

「DirectShow」を使っても再生できるようなので、Windows なら 「ffdshow」を使うなりして DirectShow の再生環境を用意します。

私の場合は Unity(RenderHeads AVProQuicktime) で再生するために Hap を利用しました。

Windows 環境で Hap が再生できない

上記の公式?に Direct Show を使って Hap を再生するためのコーデックが用意されています。 他に Hap エンコードされた動画や、アルファ(透過)付きの動画が用意されています。

ところがこのコーデックを用いても、メディアプレイヤー上で Hap 動画が再生できないことがあります。私の場合には Unity 上では動画を再生することができたのですが、 メディアプレイヤーでの動画の再生は安定しません。

NVIDIA のドライバを更新したせいなのか、Windows を更新したせいなのかは定かではありませんが、何かのタイミングで再生できていた公式の動画が再生できなかったり、 音声しか再生できない状況になっています(なったことがあります)。問題の原因は分かりません。

ffmpeg で Hap コーデックにエンコードする方法

ffmpeg のダウンロード

ffmpeg」の公式からダウンロードします。ここでは Windows 環境のみについて紹介していますが、利用方法は概ね一緒です。 ダウンロードして解凍したディレクトリの中に、ffmpeg の実行ファイルがあります。Windows なら ffmpeg.exe です。

ffmpeg でエンコード

次のようなコマンドで、動画をエンコード(変換)することができます。Windows ならコマンドプロンプト、Mac ならターミナルです。 コマンドの利用方法がわからないとは別途資料を検索してください。

ffmpeg -i [動画ファイルのパス] -vcodec hap [出力ファイルのパス]

エンコードには時間がかかりますので注意します(知らない人のために念のため)。

バッチファイル(Windows向け)

  1. 次のコードをコピーしてテキストファイルに張り付け、hapencode.bat ファイルとして保存します。
  2. hapencode.bat ファイルをダウンロードして解凍した ffmpeg ディレクトリの一番上に置きます。
  3. hapencode.bat にエンコードしたい動画ファイルをドラッグアンドドロップします。
  4. 動画ファイルと同じディレクトリに hap 形式にエンコードされたファイルが生成されます。
@echo off
cd /d %~dp0/bin
ffmpeg -i %1 -vcodec hap %~d1%~p1%~n1_hap.mov
pause

ファイル名に特殊な記号などが含まれている場合、このバッチや ffmpeg が実行できない可能性があります。

実行が進行しなくなった

コマンドプロンプトをマウスでクリックするなどすると進行が止まります(止まったように見えます?)。 コマンドプロンプトでエンターキーを入力すると、進行中の数値が再開すると思います。

Reference