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

動画のイメージ。

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

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

Hap コーデックに関して

Hap コーデックの特徴は概ね次の通りです。低圧縮であるものの(ファイルサイズが大きくなるものの)、高速に再生できるという認識で良いと思います。

  • CPU に大きな負荷をかけずに再生できる。
  • GPU でデコードできる。
  • 大きな解像度に対応している。
  • アルファチャネル(透過)に対応している。
  • ビットレートが大きくなる(ファイルサイズが大きくなる)

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

コンテナについて

Hap はコーデックですので、コンテナとは異なります。Hap のコンテナは AVI か MOV が対応するようです。 AVPro(Renderheads) によれば、AVI も対応するものの、MOV を推奨しているようです。

いくらか検証を重ねましたが、AVPro(Unity3D) を使った再生の場合、MOV の方がスムーズに再生されました。根拠(原因)は不明です。 高品質・高解像度の動画を目的とするなら、MOV が良さそうですね。

画質について

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

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

とはいえ拡大してこのレベルですし、わずかに圧縮される程度で、十分に品質を維持できていると思います。 特に高速に再生する必要がある環境においては妥協の範囲かと思います。 速度や圧縮率とトレードオフの機能ですしね。

Hap の種類

Hap はアルファチャネル(透過)を扱えるという特徴もあります。 ただしすべての Hap がアルファチャネルを持つわけではなく、Hap にもいくつかの種類があります。

Hap標準的な Hap, 再生不可を下げつつ、画質も良い感じに維持する。
HapAlphaアルファチャネルを持った Hap。アルファチャネルの分データーレートが上がる。
HapQHap より画質が良い代わりにデータレートが上がる(再生負荷とファイルサイズが大きくなるハズ)。

より詳細な HAP の種類

公式リポジトリのドラフトドキュメントに、より詳細な情報が書いてあります。Hap と HapQ はそもそも色空間が異なるようです。 HapQ は輝度情報を保存するタイプのフォーマットです。

Texture Format(s)Human-Readable NameFour-Character Code
RGB DXT1/BC1HapHap1
RGBA DXT5/BC3Hap AlphaHap5
Scaled YCoCg DXT5/BC3Hap QHapY
Scaled YCoCg DXT5/BC3 + Alpha RGTC1/BC4Hap Q AlphaHapM
Alpha RGTC1/BC4Hap Alpha-OnlyHapA

また動画再生ツールなどでコーデックを確認するとき、"HapA(lpha)" や、"HapQ" ではなく、"Hap5", "HapM" という表記になっていることがあります。 MPC や VLC で確認するときも Hap1 ~ HapA です。

Unity の AVProPlugin は HapM に対応していませんでした(2018.02.08)。HapQ, Hap5 には対応していますが。

ファイルサイズについて

手元で適当な動画を変換したところ次のようになりました。概ね 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 上では安定して動画を再生することができたのですが、一般的なメディアプレイヤーでの動画の再生は安定しません。

安定した再生環境が必要であれば、Hap が推奨するメディアプレイヤーや環境を用意するのが良いと思います。

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

chunks 1 の動画が再生できて、chunks 4 の動画が再生できないなどの状態にもなりました。

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

ffmpeg のダウンロード

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

ffmpeg でエンコード

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

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

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

オプション

ffmpeg を使って Hap をエンコードするにあたり、いくつかのオプションを選択することができます。

1 つは、先に紹介した通り、Hap のどの種類にエンコードするか、もう 1 つはデコード時に使用するスレッドの数です。 chunks オプションとして設定できるようです。サイズの大きい動画で有効かもしれませんね。

compressor なるオプションもあるようですが、ちょっと動画のエンコードとデコードについて知識不足のために、 詳細は不明です。

オプションを指定する場合は次のような感じになります。

ffmpeg -i input.mov -vcodec hap -format hap_q -chunks 4 outputfilename.mov

バッチファイル(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