Raspberry Piで外部からHDMIで入力した映像を使ってやりたいことがあったので、HDMI入力する方法がないか調べてたところAuvidea社のB101を発見。
B101 HDMI to CSI-2 Bridge (15 p.)
これはHDMI信号をカメラモジュールの接続に使われるCSI-2の信号に変換するボードです。これを使えばHDMIの映像をキャプチャできます。
買おうかどうか迷っていたところ、弊社社長がB101を購入してBlog記事を書いていたので、ひとつ譲ってもらい試してみました。
使い方は簡単で、CSI-2ポートに挿して、PCからのHDMI出力ケーブルを繋げるだけ。
ドライバは実験的であるものの元からファームウェアに入ってます。
試しにRaspberry Piで
raspivid -t 0
とすれば、PC側が外部出力として認識してくれます。
もちろん、カメラモジュール用のCSI-2ポート有効にするために、事前にraspi-configコマンドでEnable Cameraにしておくこと。
openFrameworksでキャプチャ・出力
openFrameworksを使って映像をキャプチャしていきます。
Raspberry PiへのopenFrameworksインストール方法はopenFrameworksのサイトにドキュメントがあるので、それを参考にインストールします。
Getting your Raspberry Pi ready for openFrameworks - openFramework.cc
openFrameworksでのHDMIキャプチャと出力はAddonのofxRPiCameraVideoGrabberを使用します。
ofxRPiCameraVideoGrabber - github
これはカメラモジュールをキャプチャするためのAddonですが、B101でもそのまま使えました。
試しにキャプチャした映像にGLSLシェーダを適用するサンプルコード(example-shader)を実行。
vimeo.com
映像の入出力は720p。
映像のソースはMacのVJソフト(Resolume、VDMX)やiPadのVJソフト(COLORCODE VJ)を使ったところ問題なく出力可能。
ただし、ボードの仕様には1080p25Hzの入力ができるとありますが、Macのモニターでは1080pは認識せず720pまでしか認識しません。ofxRPiCameraVideoGrabberで1920x1080/25fpsと設定しても720pでキャプチャして1080pに拡大して表示しているようです。
ハマったポイント
初めにofxRPiCameraVideoGrabberのサンプルを実行してみたところ、映像が映らなかったり、途中のフレームが抜けたように再生されてしまったりと非常に不安定でした。
フレームレートの問題かと思い、アプリのFPSやキャプチャのFPSを下げたりしましたが、あまり改善せず。
結局のところ原因は、GPUのメモリ不足。
raspi-configコマンドのAdvanced Options -> Memory Splitで、GPUのメモリ割り当てを128から256へ増やしたところ安定して再生されるようになりました。
ちなみに、カメラモジュールの場合は差分フレームだからなのか、128MBでも大体安定してキャプチャできます。
また、1080pでの出力の場合はGPUのメモリを512MBへ増やすと表示されますが、FPSが8くらいしか出ません。
/boot/config.txt を以下のように編集して、CPUクロックを900MHz、GPUクロックを500MHzに上げてみましたが変化が無し。
arm_freq=900 core_freq=500 over_voltage=6
とはいえ、自分の用途では720pで充分なので今はこれでよし。
HDMI入力の映像に加工ができるようになったところで今回はここまで。次回以降色々試していきます。
とべっち (Tobetchi)
ART Teknika佐賀スタジオマネージャ、プログラマ。WebプログラマからiOSプログラマへ転身。VJとしても活動中。