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


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

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

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

ffplay -rtbufsize 10MB -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 10MB -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"

DirectShow video device options (from video devices)
Pin "キャプチャ" (alternative pin name "0")
pixel_format=yuyv422  min s=1280x720 fps=7.5 max s=1280x720 fps=7.5
pixel_format=yuyv422  min s=1280x720 fps=7.5 max s=1280x720 fps=7.5
pixel_format=yuyv422  min s=640x480 fps=30 max s=640x480 fps=30
pixel_format=yuyv422  min s=640x480 fps=30 max s=640x480 fps=30
pixel_format=yuyv422  min s=640x400 fps=30 max s=640x400 fps=30
pixel_format=yuyv422  min s=640x400 fps=30 max s=640x400 fps=30
pixel_format=yuyv422  min s=320x240 fps=30 max s=320x240 fps=30
pixel_format=yuyv422  min s=320x240 fps=30 max s=320x240 fps=30
pixel_format=yuyv422  min s=1280x720 fps=7.5 max s=1280x720 fps=7.5
pixel_format=yuyv422  min s=1280x720 fps=7.5 max s=1280x720 fps=7.5
vcodec=mjpeg  min s=1280x720 fps=30 max s=1280x720 fps=30
vcodec=mjpeg  min s=1280x720 fps=30 max s=1280x720 fps=30
vcodec=mjpeg  min s=640x480 fps=30 max s=640x480 fps=30
vcodec=mjpeg  min s=640x480 fps=30 max s=640x480 fps=30
vcodec=mjpeg  min s=640x400 fps=30 max s=640x400 fps=30
vcodec=mjpeg  min s=640x400 fps=30 max s=640x400 fps=30
vcodec=mjpeg  min s=320x240 fps=30 max s=320x240 fps=30
vcodec=mjpeg  min s=320x240 fps=30 max s=320x240 fps=30
vcodec=mjpeg  min s=1280x720 fps=30 max s=1280x720 fps=30
vcodec=mjpeg  min s=1280x720 fps=30 max s=1280x720 fps=30
video=USB 2.0 HD-720P web cam: Immediate exit requested

CMS-V32BK は既定値では一番上のリスト pixel_format=yuyv422 min s=1280×720 fps=7.5 max s=1280×720 fps=7.5 が優先される。圧縮されたフォーマットで使用帯域の少ない mjpeg を使うには、コーデックを指定して出力時に映像コーデックをコピーする。また mjpeg や H.264 などのハードウェアエンコーダーを使うと可変フレームレートになる(かもしれない)。

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

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

ffmpeg -rtbufsize 10MB -f dshow -video_size 640x480 -c:v mjpeg -i video="@device_pnp_\?usb#vid_152d&pid_0312&mi_00#7&beb8c87&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}global" -vf fps=30 -pix_fmt yuv420p output.mp4

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

コメントを残す

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

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