Raspberry Pi 4でUSBカメラ映像をHDMIに変換できるか実験(ATEM Miniと使いたい)

最近、ユーザテストの撮影用カメラとしてOBSBot Tinyが小さくて画角調整がしやすくて大変気に入っています。この製品はUSB接続のWebカメラなので、PCでOBS Studioなどで録画/配信するには適していますが、HDMI入力しかないATEM Miniシリーズには使えません。

そこで、Raspberry Pi 4(以下RP4)でUSBカメラとして認識してそのリアルタイムスルー画をHDMIというかX上でフルスクリーン表示すればATEM Miniシリーズでキャプチャできるんじゃないかという発想です。しかもRP4にはHDMI出力が2つあります。複数のUSBカメラを接続し、それぞれを個別のHDMI出力に出せれば、2カメを1台のRP4で変換できるんじゃないか、とか。

■RP4の設定

今RP4は半導体不足の煽りで品不足、価格高騰気味なようですが、幸い少し買ったものがありました。

確か1万強くらいだったと思うので、お急ぎでない方は価格が落ち着いてから買った方がよろしいかと思います。

ケースはこちら。RP4のボードより一回り大きくなりますが、内部変換ケーブルによってフルサイズのHDMIポートが2つになる点が魅力です。

+1,000円でUSB電源アダプタが付属するセットもあるようです。自分は当初適当なUSB充電器を使えばいいやと買わなかったんですが、実際にUSBにWebカメラを接続してキャプチャしたりすると電圧不足警告が表示されました。一般的な非PDの5V充電器だと2.0Aが上限なので、やはりRP4に売られている3.0Aのものを買った方が良さそうということで結局追加しました。少し割安なので最初からセットで買うのがオススメです。

また派生モデルとして下部にM2 SSD(USB接続)を追加したモデルもあるようです。録画なども考える場合はこちらも良さげです。

ウチはとりあえずこちらのSDカードでセットアップしました。

小さいmicroSDは「あれ、どこいった?」となりがちですが、そんな時この水色のカラーが目立つので扱い易いです。

■OSインストール

ちょうどRaspiOSの64bit版が正式扱いになったというニュースをみたので、これを機に新規セットアップしました。公式から2022-01-28-raspios-bullseye-arm64.zipを落としてきて解凍し、これまた公式ツールのRaspberry Pi Imagerを使ってSDカードに展開しました。

当初X-WindowのないLiteで軽量なシステムを構築できないかもトライしましたが、色々ツールを入れるのが大変で断念。キーボードやらネットワーク設定やらもひと手間です。結局あきらめてフルバージョン(X-Windowsあり)で仕切り直し。結果的に必要なツールは揃っており苦労なく表示できました。

■USBカメラの映像をウインドウに表示する

当たり前っちゃ当たり前ですが、OBSBot tinyの初代および4Kモデル双方とも差すだけで認識しました。

表示ツールはVLCなども試したんですが遅延が大きく、ffplayがマシという感じです。ただしフルHDにするとかなり遅延が出てATEM Miniへの入力ソースとしては致命的。1280×720ならほぼ気にならないですがフレームレートは10fpsに強制的に落とされてしまいました。

起動はターミナルからこんな感じ。

ffplay -i /dev/video0 -video_size hd720 -an -fs

-iで入力デバイス。OBSBot Tiny初代と4Kを同時に挿した場合、それぞれ/dev/video0と/dev/video2にアサインされました。

-video_sizeは1280×720や1920×1080のように書いてもいいですし、hd720、hd1080のような略記も使えます。

-anは音声無効化、-fsは全画面表示です(ESCで終了)。

-framerate 30などとつけるとフレームレート指定ができますが、hd720でも強制的に10fpsに落とすよ、というウォーニングが出て上書きされてしまいます。

実験したところ、サイズをwvgaにすると950×540になり15fps、vgaなら640×360で30fpsになりました。30fpsあると明らかに残像感がなく綺麗ですが、遅延としては差は感じません。HD720/10fpsかWVGA/15fpsが実用上バランスが良いかなと思います。

正直もうちょっと行けるかと思ってたんですが微妙な結果でした。もしかするとハードウェアデコーダーを使うなど何かしら設定で改善する余地もあるかもですが、吊しの状態だとこれが限度でした。

追記:

オプションでMotionJPEGを明示したところ改善がありました。v4l2-ctlコマンドで対応コーデックを調べたところ、こんな結果が。

pi@raspberrypi:~ $ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'MJPG' (Motion-JPEG, compressed)
		Size: Discrete 640x360
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 960x540
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
	[1]: 'YUYV' (YUYV 4:2:2)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x540
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.200s (5.000 fps)
	[2]: 'H264' (H.264, compressed)
		Size: Discrete 640x360
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 960x540
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.017s (60.000 fps)
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)

先に書いた上限値はYUYVモードのもののようで、MotionJPEGとH.264ならばMax 60fpsが目指せそうだったので追加検証してみた結果、

  • H.264は重く、MotionJPEGが良いカンジ
  • それでもフルHDは遅延発生

ということで、現状のベストコマンドは、

ffplay -i /dev/video0 -pixel_format mjpeg -video_size hd720 -an -fs

ということになりそうです。これで30fpsになりました。-framerate 60を明示的につけるとlow voltage警告が出て絵が止まったりシステムがフリーズしたので、こちらは別途3A電源が届いてから実験します。とりあえず720p/30fpsが出ればATEMなどでPinPするソースとしては充分かなと思います。

・デュアルディスプレイに同時表示は無理そう

残念ながら1台のRP4でHDMI 2系統にそれぞれWebカメラ映像を出すことは現状ダメぽいです。上記の限界があるので単純に負荷2倍だと厳しいというのもありそうですが、どもそもffplayが現状マルチストリームに対応してないようです。別々のターミナルから同時起動しても、最初のプロセスを閉じるまで2つ目が開かない感じです。

■まとめ

Raspberry Pi 4を使って、USB接続のWebカメラを簡単にHDMI出力デバイスとして扱うことができました。ただしせっかくHDMI出力が2系統あるRP4でも並行出力は無理そう。そろそろ日本でも出回るRaspberry Pi Zero 2で同等のことができるなら、Webカメラ1台ごとにこちらを装着するのも良いかも知れません。結局電源がいるという意味ではビデオカメラを使うのとかわらないですが、物理サイズが大きく違うので、運搬が楽になったり、撮影中の存在感を減らすことができる点はメリットかと思います。なにか3DプリンターでOBSBot Tinyと一緒にマウントできるケースを作ってみたいです。

今後の課題としては、

  • 電源オンでHDMIに全画面出力が出るところまで起動処理の自動化
  • SDカードを損耗を防ぐためにシステムのRead Only化
  • 長時間耐久テスト

などを行っていきたいと思います。

今年UT/インタビューに導入して良かった機材紹介 2021

今年は後半にちょいちょい会場実査を実施できるようになってきたものの、やはりトータルとしてはリモートが多かったです。基本、会場だとハード、リモートだとソフト面での機材やノウハウが中心になりますが、それぞれについて「今年これが役に立った!」というのを紹介してみたいと思います。

■ハードウェア編

OBSBot Tiny(パンチルト制御できるWebカメラ)

まだ2実査ほどしか使ってないですが、個別記事をまだ書いてなかったのでここでトップに挙げておきます。

Webカメラです。普通のWebカメラとの違いはパンチルト(上下左右に向く)機構がついている点と、それを使ってAI画像処理で人物を自動で追いかけてくれる点。アギレルゴの川口氏が使ってみたけどイマイチだったということで譲り受けました。

通常UTやインタビューでビデオカメラ撮影する時、三脚雲台でアングルを調整したりすると思います。しかし参加者が姿勢やデバイスの持ち方を変えるとちょいちょい画角から外れてしまい再調整を余儀なくされがち。そういう時に、電動でリモート制御できるPTZ(パンチルトズーム)カメラだと便利です。UTラボなんかだと天井についていたりしますね。あぁいう製品は監視用カメラの流用だったりして大変お高いですし、一般会議室にポっとつけられるものでもありません。映像信号やコントロール信号も特殊でPCに直接つなげられないことも多いです。

ところがこのOBSBot TinyはUSBケーブル1本で映像音声は普通のUVC/UAC接続のWebカメラである上、専用ユーティリティをPC/Macにインストールすれば簡単に操作ができます。ありそうでなかった大変レアな製品です。映像音声とパンチルト制御は独立しているので、映像音声をOBS StudioやTeams/Zoomなどに入力しているのと全く独立に制御可能です。OSB Studiの場合、映像ソースのプロパティ画面からもPTZ操作可能です。さらに専用ユーティリティで各操作にキーボードショートカットがついていますので、Bluetoohtキーボードや後述のマクロキーパッドを使って離れたところから操作もできます。例えば、OBSBot Tinyと録画配信用PCはインタビュールームに置きつつ、Bluetoothが届く隣の部屋から見学者がカメラ操作する、なんてユーザビリティラボみたいなことが実現できるのです。少なくともPCがモデレーターの手の届くところにあれば、カメラ+三脚のところまで歩いていって調整する必要はなくなります。

実のところAI自動追尾機能はまだ実務では使用していません。誤動作したらイヤだなと。ざっと試した限り、追跡自体はそこそこ正確だと感じますが、顔を画面のどのいちに持ってくるのかが制御できません。通常UTやインタビューでは身体全体ではなく顔だけを抜いて画面の片隅に入れたりすることが多いですが、こいつのAIが顔を画面の中心にもってくるのか、身体全体でセンタリングするのか、みたいなところがコントローラブルではない上に、仕様でもあまり触れられていません。川口氏曰く身体を基準にしてるっぽいとのこと。なんで、画面の一部を切り抜いて使用するには厳しいかなと。顔の位置を決まったサイズ、決まった位置にして追ってくれるなら有り難いんですけど。

なおユーティリティで自動追尾は無効にできるので、完全にPTZ Webカメラとして使うことができます。この状態で使ってみましたが、途中で不具合を起こすこともなく快適に使用できました。デジカメ+HDMIキャプチャなんかよりよっぽど安定感あります。これで光学ズームがあれば最高ですが、最近海外で販売開始された4Kモデルならば電子ズームでも充分な解像度が出ると思うので、国内販売が始まったら買ってみようかと思っています。

ちなみに海外ではパンチルトズームに使えるリモコンも売られてるようですが、Bluetoothで技適をとってないのか国内の代理店からは販売されていないようです。またOBSとついてますばOBS Studioとはなんの関係もありません。

USBの規格上の制限としてケーブル長を4mくらいまでしか延ばせないという問題がありますが、それ以外ではもうビデオカメラいらなくね?と思える優秀な製品です。

RODE Wireless GO2(ワイヤレスマイク)

今年一番活躍しました。詳細は個別記事にて。簡単にいうと、1つの受信機で2台の小型ワイヤレスマイクを受けられるインタビュー向けのマイクシステムです。進行役と参加者それぞれが胸元に装着しておけば、バウンダリーマイクよりも明瞭に音声を拾えます。またマイク内にメモリが内蔵されて録音もできるので別途バックアップ用ICレコーダーを用意しなくて済みます。

AZ Macro (マクロキーパッド)

テンキーより更に少ないボタン数に絞った特定用途向けの小型キーボードのことをマクロキーパッドと呼びます。PhotoshopやPremereのようなやたらツールがたくさんあるソフトやゲームなどの操作を支援するものです。多くの製品はUSBキーボードとして固定のキーコードを発するもので、ソフト側でショートカットアサインをあわせたり、AutoHotKeyのようなユーティリティを使って変換したりします。一部の製品はファームウェアをいじって設定を書き込める場合もあります。

しかしこのAZ Macroは手軽なWebベースの設定システムを持っていてブラウザから簡単に各キーがどんなキーコードを送出するかをカスタムできます。

これを使って、

  • OBS Studioのシーンを切り替えたり録画開始
  • 上記OBSBotのパンチルト操作
  • Zoom、資料パワポ、進行シート、記録エディタなど狭い画面に様々なウインドウがひしめくオンラインインタビューで、「(例えパワポがバックグラウンドにいても)1キーでスライドを1ページめくる」みたいなマクロを実行

などの操作を1ボタンで実行できるようになり、よりスムーズなセッション進行を手助けしてくれました。さらにこの製品はBluetoothキーボードとして動作するので、少し離れた場所から進行役以外の人がさりげなく操作をすることができたりもします。同人ハードなどで入手性にやや難ありですが利用シーンがピンとくる方は是非チャレンジしてみてください。自分でハンダ付けするDIYキットと完成品が選べます。

■ソフトウェア編

XSplit VCam、Audio Hijack + Loopback

今年は久ぶりにメインPCをMacにしたので、いままでWindowsで愛用していたNVIDIA Broadcastが使えなくなりました。そこで、単体のバーチャル背景ツールとしてXSplit VCam、マイクノイズ除去ツールとしてAudio HijackとLoopbackの組み合わせを導入。これでリモート案件もMacでつつんがなくこなせるようになりました。(バーチャル背景なんて今時ZoomにもTeamsにもビルトインで実装されてるじゃないか、とお思いかも知れませんが、業務用のインタビューシステムではついていないことも多いのです…)

AutoHotKey

Windows専用になりますが、あるキー入力に対し、別のキーイベントや特定の操作をプログラムできるフリーソフトです。カメラや配信ツールの制御をしたり、オンライン会議のミュート操作、インタビューに相手に提示する写真や動画、スライドの切り替えなど、色々な制御を自動化、ショートカット化できます。きちんと体制の整ったチームで仕事をするなら作業分担もできますが、私はワンオペなことも多く、事前にこういうツールを駆使して仕込みをしておくと本番中に楽ができます。AutoHotKeyはプログラミング的な素養が必要かも知れませんが、とても多くのことができる良ツールです。

動画眼Lite

手前味噌で恐縮ですが、動画ファイルに頭出し用のインデックスをつける拙作「動画眼」シリーズに、専用アプリのインストールを必要とせずブラウザ上で簡単に閲覧(のみ)できる「動画眼Lite」をリリースしました。

動画眼でデータを作る必要がありますが、Lite形式出力したhtmlファイルを動画といっしょに渡すだけで、相手方は動画眼をインストールせずとも、またMacであってもチャプター付き再生をすることができます。ソフトウェアのインストール制限がある企業さんで重宝するかなと思って作成し、実際にいくつかの案件で納品ビデオデータにこれでチャプターを入れてお渡ししたところ便利だとご評価いただきました。

現在、このデータを作成するための動画眼もWin/Mac両対応となるVer3を準備中です。年内に出したかったけどちょっと厳しい雲行きになってきたかな…もう少々お待ち下さいませ。

■まとめ

コロナ禍で急遽リモートでユーザーテストをしなくちゃとなった昨年からだいぶ経って、自分達も、リクルーティング会社もそして参加してくださる方達やリモート見学するクライアント側も色々と知見が貯まって色々とスムーズに回るようになってきた感があります。それでも、より会場実査に近い形で例えばハードウェア製品を使って評価してもらうことはできるか?などと意欲的な要望もいただいたりとチャレンジは続きます。

会場実査は会場実査で、感染対策をしつつ見やすい/聞きやすい配信を見学者にお届けする工夫や新しい技術は毎回頭をひねりながら試行錯誤しています。

上に紹介したような製品は良さげだけど使いこなせる自身がないという方は是非ご相談いただければと思います。リサーチ案件としてだけでなく機材支援のみでもお受けしておりますので、「タスク設計や進行役は自前でやれるので、配信だけ手伝って」みたいな案件も歓迎です。

来年もどうぞよろしくお願いいたします。