Full HD映像をMacに入力してoFでリアルタイムにエフェクトをかける

Full HD(1080/59.97i)のカメラの映像をリアルタイムにoFで処理したい

イベント会場の映像にoFでリアルタイムにエフェクトをかけたかったので、その方法を色々試行錯誤したのでその記録。カメラはSONYのHVR-Z5Jだったので、出力はHDMIかSDIしかなくて、それをMacProへどう取り込むかが問題でした。VC-30HDとかVR-50HDが使えそうだったんですが、色々条件が合わず断念。Blackmagic DesignのDeckLink mini Recorderを使えば出来そうだったので、試行錯誤のメモです。

DeckLink mini Recorderを購入

今回は時間が無かったので、System5の半蔵門のショールームで購入。ここはプロ用の機材を色々試してから買えるのでかなり良いです。今回の案件ではイレギュラーな対応してもらったり、色々お世話になりました。

純正アプリでテスト

MacProにDeckLink mini Recorderを挿してドライバをインストールしたら、取り敢えず純正アプリのBlackmagic Media Expressで映像を取り込めるかどうかをテスト。

  1. システム環境設定>その他>Blackmagic Designを開いて、「入力設定」を環境に合わせてSDIかHDMIに設定。「1080PsFではなく1080pを使用」にチェック。ここをチェックしておかないとダメらしいです(未確認)。
  2. Media ExpressのPreferenceを開いて、「Project Video Format」をカメラの設定に合わせる。
  3. 「Log and Capture」タブを選択して映像が表示される事を確認。
  4. 映像が表示されなければ「Device」メニューからボードが認識されてるか、Preferenceの「Project Video Format」が正しく設定されているかを確認。自分では30pだと思ってても59.97iだったりとかするので、色々試す。そしてこの設定を覚えとく。

DeckLink SDKでテスト

Blackmagicのサイトで配布しているDeckLink SDKを使ってキャプチャのテスト。ダウンロードしたファイルの、Blackmagic DeckLink SDK x.x.x>Mac>Samples>binの中にある、CapturePreview.appを起動し、Media Expressで確認したVideo Formatを指定すると、Previewが表示されることを確認。表示されなければ、カードかケーブルがちゃんと刺さってないか、Video Formatの指定が間違っているか、相性悪いかのどれか。何しても映らなかったら、諦めて他の方法を試したほうが良いかもしれません。

漸くofxBlackmagic

ここまでできてやっとoF作業。oFのForumで紹介されてたofxBlackmagicGrabberだとどうしてもコンパイルが通らなくて諦めようとしたら、ofxBlackmagicというアドオンを発見。Kyle McDonald様様。

  1. projectGeneratorからofxBlackmagicを追加してプロジェクトを作成。
  2. addons>ofxBlackmagic>src>ofxBlackmagic.cppが現状はw1920,h1080,f30にしか対応していないので、使いたい設定が無ければ適宜自分で追加する。 bool ofxBlackMagic::setup(int width, int height, float framerate) else if(width == 1920 && height == 1080 && framerate == 59.94) { displayMode = bmdModeHD1080i5994; }
  3. 同じくaddons>ofxBlackmagic>src>DeckLinkControllerも修正。 bool DeckLinkController::startCaptureWithMode(BMDDisplayMode videoMode) else if(videoMode == bmdModeHD1080i5994){ vector prototype(1920 * 1080 * 2); buffer.setup(prototype); }
  4. testApp.hでofxBlackMagic.hをinclude #include "ofxBlackMagic.h" ofxBlackMagic camera;
  5. 確認した設定でofxBlackmagicインスタンスの初期化>update>draw camera.setup(1920, 1080, 59.94); camera.update(); camera.drawColor();という感じで描画される(はず)
  6. エフェクトをかけたりは、 vector& ofxBlackMagic::getYuvRaw(); ofPixels& ofxBlackMagic::getGrayPixels(); ofPixels& ofxBlackMagic::getColorPixels(); ofTexture& ofxBlackMagic::getYuvTexture(); ofTexture& ofxBlackMagic::getGrayTexture(); ofTexture& ofxBlackMagic::getColorTexture();辺りを適宜使うと良いかと。

結果

エフェクトかけたりするとそれなりに遅延は出るけど、キャプチャした映像を表示するだけなら1〜2フレームの遅延のみで十分実用範囲内と思います。PCIeボードなので、別で電源やスペースを食わないので、今回の様にスペースに限りがある場合にはとても助かりました。金額も15,000円くらいなので、気軽に買える。今回はものすごく沢山の機材を使ってて、あまり目立たなかったけど、システムの肝はこのDeckLInk mini Recorderでした。 BlackmagicにはIntensityってのもあって、USB3.0やThunderbolt接続の物があるので、MacBookProの場合にはこっちを使うといいかも。多分同じやり方でできるでしょう。今回はエフェクトにグラボのパワーが必要だったのでMacProでしたが。

お問い合わせやご意見などは@yasnisまでどうぞ