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

アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

Raspberry PiでHDMI入力をopenFrameworksでキャプチャする

Raspberry Piで外部からHDMIで入力した映像を使ってやりたいことがあったので、HDMI入力する方法がないか調べてたところAuvidea社のB101を発見。
B101 HDMI to CSI-2 Bridge (15 p.)

これはHDMI信号をカメラモジュールの接続に使われるCSI-2の信号に変換するボードです。これを使えばHDMIの映像をキャプチャできます。
買おうかどうか迷っていたところ、弊社社長がB101を購入してBlog記事を書いていたので、ひとつ譲ってもらい試してみました。

使い方は簡単で、CSI-2ポートに挿して、PCからのHDMI出力ケーブルを繋げるだけ。
f:id:tobetchi-at:20161129195101j:plain
ドライバは実験的であるものの元からファームウェアに入ってます。
試しに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ソフト(ResolumeVDMX)や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入力の映像に加工ができるようになったところで今回はここまで。次回以降色々試していきます。

Author

とべっち (Tobetchi)

ART Teknika佐賀スタジオマネージャ、プログラマ。WebプログラマからiOSプログラマへ転身。VJとしても活動中。

スポンサーリンク