以前の記事でレジストリを書き換えて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

vcodec=mjpeg min s=1280×720 fps=30 max s=1280×720 fps=30形式で再生する。-codec:v mjpg-pixel_format yuvj422pでもエラーになるが、-video_size 1280×720 -framerate 30でmjpgの表示できた。
ffplay -rtbufsize 10MB -f dshow -video_size 1280x720 -framerate 30 -i video="USB 2.0 HD-720P web cam"

-pixel_format yuyv422でyuyv422を明示して使う。
ffmpeg -rtbufsize 10MB -f dshow -pixel_format yuyv422 -i video="USB 2.0 HD-720P web cam" -c:v ffv1 yuyv422.mkv
ffplay -rtbufsize 10MB -f dshow -pixel_format yuyv422 -i video="USB 2.0 HD-720P web cam"

色関係のメタデータが未定義なので入力時に明示するほうが後の処理で困らない。
ffplay -rtbufsize 10MB -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -f dshow -pixel_format yuyv422 -i video="USB 2.0 HD-720P web cam" -vf showinfo

実際にエンコードするとき色関係のメタデータは出力オプションも併用して指定する。
ffplay -rtbufsize 10MB -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -f dshow -pixel_format yuyv422 -i video="USB 2.0 HD-720P web cam" -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv output

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

コメントを残す

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

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