Libvlcでキャプチャーデバイスを扱う

200万画素WEBカメラUCAM-C820ABBKを買いました

ノートパソコンにはカメラが備わっていて、ZoomやらTeamsやらで使うことができますが、デスクトップパソコンでZoomを使うのだといわゆるWEBカメラが必要です。というわけで、デスクトップパソコン用に安価なELECOMのWEBカメラを購入しました。

こんな感じで、モニタの上部に置いてます。ちなみにデスクトップマシンは2台ならべて使っていて、どちらのマシンからでも使いたいので、モニタのハブにつないでいて、そのハブのアップストリームは、KVMにつながっており、2台のマシンを切り替えた時に、USBの切り替えも行われるので、表示されているマシンからWEBカメラも使えるようになります。VLCないしlibvlcからはWEBカメラはキャプチャーデバイスとして認識されます。これはシステム(Windows OS)が認識しているカメラと同じですが、そのカメラを列挙するlibvlcの関数群がうまく機能しないようなので、別のプログラムで扱います。

山本ワールドさんの作ったプログラムです。あらかじめ(a priori アプリオリに)カメラとそれぞれのカメラで選べる解像度のリストが得られます。元は、Visual C++で書かれたプログラムです。

Hikvision
2560 * 1440 25.0fps
2560 * 1440 25.0fps
1920 * 1080 25.0fps
1920 * 1080 25.0fps
1280 * 720 25.0fps
1280 * 720 25.0fps
704 * 480 25.0fps
704 * 480 25.0fps
352 * 240 25.0fps
352 * 240 25.0fps
FHD Camera
1280 * 720 30.0fps
1600 * 896 30.0fps
1024 * 576 30.0fps
800 * 600 30.0fps
800 * 480 30.0fps
640 * 480 30.0fps
640 * 360 30.0fps
424 * 240 30.0fps
352 * 288 30.0fps
1920 * 1080 30.0fps
1280 * 720 10.0fps
1600 * 896 7.5fps
1024 * 576 10.0fps
800 * 600 15.0fps
800 * 480 25.0fps
640 * 480 30.0fps
640 * 360 30.0fps
424 * 240 30.0fps
352 * 288 30.0fps
1920 * 1080 5.0fps

です。新しい方のカメラはFHD Cameraで、他方は、前から使っている“ネットワークカメラ”です。以前の記事でrtspプロトコル経由でアクセスした例を示しました。これが何故ここに見えるのかは、別記事で紹介します。さて、VLCを起動してみましょう。

これをダブルクリック。

上図で”キャプチャーデバイスを開く”を選択。しばらく時間がかかりますが、じっと我慢していると、

プルダウンメニューからビデオデバイスとオーディオデバイスを選択します。

ビデオデバイスは当然今回の”FHD Camera”で、オーディオデバイスはカメラ付属のマイクです。

今回追加した”FHD Camera”とこのカメラのマイクを選択。ビデオサイズを入れて、詳細オプションの表示にチェックを入れて、詳細設定オプションをクリック。

ここでは画像のアスペクト比を16:9等として、“OK”

上図のようにオプションの編集欄に見えるテキストを頭から末尾まで選択してコピーしておきます。後で使います。

:dshow-vdev=FHD Camera :dshow-adev=マイク (FHD Camera Microphone) :dshow-size=1920×1080 :dshow-aspect-ratio=16\:9 :dshow-chroma= :dshow-fps=0 :no-dshow-config :no-dshow-tuner :dshow-tuner-channel=0 :dshow-tuner-frequency=0 :dshow-tuner-country=0 :dshow-tuner-standard=0 :dshow-tuner-input=0 :dshow-video-input=-1 :dshow-video-output=-1 :dshow-audio-input=-1 :dshow-audio-output=-1 :dshow-amtuner-mode=1 :dshow-audio-channels=0 :dshow-audio-samplerate=0 :dshow-audio-bitspersample=0 :live-caching=300

頭の空白一個が取れてしまっていることに注意して、”再生”

アスペクト比が正しく表示されていればおけ。さて、libvlcないし以前に投稿したLibvlcのwrapperからこのカメラでキャプチャーするには、不要なオプションを削る必要があります。

:dshow-vdev=”FHD Camera” :dshow-size=1920×1080 :dshow-aspect-ratio=16\:9

wrapperに食わせる前にテストしたければ、vlcをコマンドライン経由で起動してみても良いです。

を右クリックして、ファイルの場所を開く、そこでGit Bashを起動。

ここで右クリック。

と入れると、

先ほどのGUIなVLCから再生したのと同じ結果が得られました。ここまでくれば、コマンドライン

$ ./vlc dshow:// :dshow-vdev="FHD Camera" :dshow-size=1920x1080 :dshow-aspect-ratio=16\:9

これをLibvlcのwrapper経由で指示すれば良さそうですね。

		vlc = new VLC(playbackurl);
		vlc->Option(" :dshow-vdev=\"FHD Camera\":dshow-size=1920x1080 :dshow-aspect-ratio=16\\:9");
		vlc->SetHWND(Panel1->Handle);
		vlc->Play();

コアはこれだけです。プログラム全体を示してもたいした長さではありませんから、libvlcwrapperの使用例を参考にしてみてください。

libvlcのdiscovererはmedia用とrenderer用とがありますが、どちらも筆者が調べた範囲ではまともに動く例が見つかりませんでした。例によってCopilot君が色々とsuggestしてきますけど、全然使えません。完動例をお持ちの方は是非コメントなどお願いします。

コメント