読者です 読者をやめる 読者になる 読者になる

自習室

こもります

Windows の openFrameworks でまともに動画再生の出来る ofxDSHapVideoPlayer を利用する (追記あり)

Mac だと通常の ofVideoPlayer でもそこそこ動画再生出来るのですが、 Windows だと、数十秒の HD 動画を再生するのもろくに出来ません。がたがたしたり、止まったりします。

oF コミュニティは基本 Mac な雰囲気なのでこの件は3年前に一度諦めていたのですが、どうしても Windows + oF で動画再生をしたかったので、改めて色んな物を調べてみたのですが、 ofxDSHapVideoPlayer が一番お手軽に使えそうだったので、簡単に経過と使い方をまとめておきます。

候補

  • ofVideoPlayer
  • ofxHapPlayer
  • ofxDSHapVideoPlayer
  • ofxWMFVideolayer(追記)

ofVideoPlayer

冒頭で述べたとおり使い物になりません。

ofxHapPlayer

GitHub にも記述がありますように、どうやら VS向け0.9には対応していないようです。GitHubに上がっている物をそのまま突っ込むとビルドも通らなかったので、ちょっとコードを弄って無理矢理動かしてみたのですが、ビルドが通り起動は出来ても動画は表示されませんでした。

また、0.84 でもビルドが通りませんでした。

ここを深追いするのはやめにしました。

ofxDSHapVideoPlayer

以下の通りでちゃんと使えることがわかったので、利用する事にします。FullHD の動画も、結構長い動画も、サクサク再生出来ます。

ofxWMFVideolayer(追記)

はじめ、 ofxDSHapVideoPlayer の紹介と、Hapへのエンコードの仕方だけの記事にしようと思っていたのですが、追加で ofxWMFVideolayer も試してみたところ、普通に動きました。この記事でこの後、 Hapは動画サイズがでかくなるからだるい という内容を書いていますが、 ofxWMFVideolayer なら通常の H264 .mp4 もそのまま再生出来るので、通常の利用法ならこちらの方が良さそうな気配です。(あーれー)

ofxWMFVideolayer の問題点

ただし、 Github 記載がありますように NVIDIA を想定して作られているらしく、Compatibility に問題があるようです。 下に記載した私の作業環境ではうごきました。

また、現状の ofxWMFVideolayer は、 ofBaseVideoPlayer を継承する形では実装されておらず、 getPixels() 関数や getTexture() 関数が実装されていません。この辺りが問題になる方は、 ofxDSHapVideoPlayer を利用した方が良いかも知れません。

Hap 動画の容量デカすぎ問題

Hap ではデコードのスピードを重視するために、ビデオデータの容量が通常の H264 mp4 の20倍程度のサイズになります。そこだけが問題です。たとえば、30秒程度の動画が300MB近くあったりします。大問題なのですが、今回はそれが問題にならない人向け、と言うことでここから先おつきあい下さい。

使い方

  1. Windows に codec をいれる
  2. Adobe Media Encoder でエンコードする
  3. ofxHapPlayer を oF に組み込む

作業環境

- Windows 8.1
- GIGABYTE Brix Intel Core i7-3537U @ 2.50 GHz
- oF (for Visual Studio) v0.9.7
- Visual Studio Community 2015
- Adobe Media Encoder CS5.5

1. Windows に HAP For Direct Show codec をいれる

ここでインストールされるものは再生のためだけはなく、続くエンコーダでも利用されます。

2. Adobe Media Encoder でエンコードする

ffmpeg に挫折

本当は ffmpeg を設定したら狙い通りの hap がエンコード出来ますよ! という記事にしたかったのですが、色々トライして挫折しました。

一方で、上記の codec をインストールした時点で、 Adobe Media Encoder で Hap エンコードが可能になったので、もうそちらで済ませてしまうことにしました。 Adobe 使えない人にはごめんなさい。

Media Encoder での手順

使っているのは CS5.5 の Media Encoder です

  • 形式で Microsoft AVI を選ぶ
  • 「ビデオコーデック」の中から Hap を選ぶ
  • 必要なら「コーデック設定」から最上位画質を選んだりする。私は通常のままで充分。
  • 幅・高さ・フレームレート・縦横比 などを決める
  • フィールドタイプ はプログレッシブ

f:id:AMANE:20161218211530p:plain

3. ofxDSHapVideoPlayer を oF に組み込む

最後に

解像度の多きな動画もサクサク再生出来て、自分のやりたかったことはさくっと実現できて良かったなーなのですが、動画のサイズが爆発するので、長時間の動画再生には向いていません。用法容量を守り正しくお使い下さい。

追記 → ofxWMFVideolayer もある

途中に書き加えましたが、 ofxWMFVideolayer でも普通に Full HD 30p, 尺の長い動画が安定して再生出来ました。この記事は、Hap のための個人的なメモとして残しておこうと思います(笑)