以前の記事 でレジストリを書き換えて ffmpeg で表示されるデバイス名を変更して同時利用する記事を書いたが、今回はそんな危険なことをせずに ffmpeg それ自体にそれぞれを識別する機能が追加されたのでそれを利用してウェブカメラを同時利用する方法。

まず最初にインストールされているデバイス(Windows)を表示する
ffmpeg -list_devices true -f dshow -i dummy

すると昔は表示されていなかった Alternative name というのが追加されているのでこれを ffmpeg の入力デバイスに指定する。これはハードウェア毎に割り振られるので個別に指定できる。

例:サンワサプライの CMS-V32BK の場合

ffplay -rtbufsize 100MB -f dshow -i video="@device_pnp_\?usb#vid_152d&pid_0312&mi_00#7&1557c68a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global"
ffplay -rtbufsize 100MB -f dshow -i video="@device_pnp_\?usb#vid_152d&pid_0312&mi_00#7&beb8c87&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global"

一つ注意点に同時利用するには USB ポートの差し込みを別ポートに差し込まないと同時利用できないかもしれない。例えば USB3.0 と USB2.0 を使うなど。

そのほかに入力フォーマットやコーデックの指定もでき、一部のウェブカメラには H.264 ハードウェアエンコーダーが搭載されているのでそれを利用することもできる。

CMS-V32BK の場合、無圧縮の yuyv422 の他に mjpeg が利用できる。これは以下のコマンドで確認できる。

ffmpeg -list_options true -f dshow -i video="USB 2.0 HD-720P web cam"

ffmpeg の既定値では yuyv422 が優先される。圧縮されたフォーマットで使用帯域の少ない mjpg を使うには、コーデックを指定して出力時に映像コーデックをコピーする。また mjpeg や h.264 などのハードウェアエンコーダーを使った場合、可変フレームレートになる。

ffmpeg -rtbufsize 100MB -f dshow -vcodec mjpeg -i video="@device_pnp_\?usb#vid_152d&pid_0312&mi_00#7&beb8c87&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global" -copyinkf -vcodec copy mjpeg.mkv

list_options で表示された解像度に指定する場合は video_size を指定する。フレームレートは制御できないかもしれないのでビデオフィルタの fps を使う。ただしビデオフィルタを使うと映像コーデックのコピーはできない。
ffmpeg -rtbufsize 100MB -f dshow -video_size 640x480 -vcodec mjpeg -i video="@device_pnp_\?usb#vid_152d&pid_0312&mi_00#7&beb8c87&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global" -copyinkf -vcodec copy mjpeg.mkv

公式ドキュメント
FFmpeg Devices Documentation :: dshow

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)