HDMIキャプチャの映像をNDIで送るアプリを、Claude Codeで作った
きっかけ
2台のPCでOBSを起動して、一方のOBSからNDIでプログラム映像の出力を行い、もう一方のOBSでYouTube Libe配信中の映像ソースとして利用できることが、先日のペルセウス座流星群のライブ配信の時にわかりました。
これは応用効きそうだと。
そこで、Claude Codeを使って、手持ちのUSB3.0 の HDMI キャプチャカードの映像をNDI 出力するプログラムが作成できるのかを試してみたくなりました。
プログラムなんて作らなくてもOBSにNDIプラグインを入れれば、HDMI キャプチャカードの映像をソースにしてNDI出力することは可能なことではあるのですが、もしオリジナルプログラムでこれが実現できれば、とある計画を実行に移すことが可能となります。
早速、NDI SDK 6 のドキュメントとサンプルをClaude Codeに読み込ませて、それを参考に実装を試してみました。
最初は内蔵カメラで確認
キャプチャボードを使う前に、まず内蔵カメラの映像で動作を確認しました。
OBS にNDIの映像を出すところまではすぐに出来上がり、アプリ側のプレビュー画面の縦横比や、NDI出力停止時の画面のクリア、状態表示など気になった部分を順に修正してもらいました。

NDIで送信されている映像を、OBSで受信した様子

表示色がおかしい
青色のものがオレンジで表示されました。
Claude Code に直してもらったのですが、プレビュー表示は直っても 今度はNDI出力の色が違っていたり、結果がさらに青みがかったりと、何度か「元に戻してください」と指示する必要がありました。
OpenCVの内部処理方式により発生した問題のようでした。
最終的には、映像を BGRA のまま扱う形となり、プレビュー表示も NDI出力 も正しい色になりました。
キャプチャボードを認識させる
接続したキャプチャボードの映像に切り替えが行えず、デバイス名も「カメラ0」のままでした。
WMI でのデバイス名の取得は思ったような結果にならなかったので、まず列挙だけをテスト用のプログラムで確認してから本体に組み込む操作が、特に指示したわけでなくClaude Code の判断で勝手に行われました。
結果的に、Windows のデバイス情報の列挙順が、OpenCV で使うデバイス番号と一致することが判明し、デバイス名称の取得に使うことになったようです。

音声も送る
とある計画には、映像だけで十分と思って音声取り込みは不要としていたのですが、
HDMIデバイスから音声も取り込めたほうが後々応用が効きそうだったので、音声もオプションで扱えるように仕様変更としました。
実装が変更されてOBS に映像と音声が届くことが確認できました。
FPS が上がらない、そしてフリーズ
HDMIからは60fps の映像が入力されているはずなのに、プレビュー表示が 35fps前後から上にはいかない状態でした。
原因は、フレームごとの無駄な待機と、プレビュー描画の処理が重い という 2 つで、それぞれ修正をしてもらいました。
修正後今度は画面が固まってしまう問題が発生しました。キャプチャの読み込み処理が UI のスレッドで動いていた事が原因であると分析され、別スレッドに切り離す実装に変更されました。
ここまでの感想
実際に頭の中に思い描いたプログラムが、Claude Codeに指示するだけで、短時間で実装できてしまった。
自分では一切コードを書かずに。
不具合が起きても、状況を的確に伝えれば、Claude Code自体が原因調査から修正まで全て処理してくれるので、マジで驚きです。また画面キャプチャを貼り付けるだけで、状況を理解するところとか、まるで人間相手にやり取りしているような感覚になります。凄すぎる。
