mplayer で V4L に対応のキャプチャデバイスを使う備忘録

Environment
Photo by hyt.

mplayer で V4L に対応のキャプチャデバイスを使う備忘録です.

いつもの通り結論から記すと,

mplayer -tv driver=v4l2:device=/dev/video2:width=1280:height=720:fps=30:outfmt=yv12:alsa:adevice=hw.1:forceaudio:immediatemode=0:audiorate=48000 tv://

のような感じで良いみたいです.最大化して起動したければオプション -fs を追加すれば良いみたいです.

公式マニュアル

まず,公式の mplayer の解説は

MPlayer - The Movie Player

のようです.しかし,このドキュメントだけでは多分読んでもなにがなんだか(少なくとも私には)分かりませんでした.

仕方ないのでいろいろ調べてみた結果,わかったことを以下に記します.

オプションの解説(映像)

まず,映像に係るオプションについて説明をします.

まず,mplayer に -tv のようなオプションを与えている理由ですが,これは -tv が V4L 対応の TV チューナーの視聴・取込みオプションだからのようです.その次のオプション driver=v4l2 についてはそのままの意味です.

次のオプション device=/dev/video2 は利用する V4L2 対応のキャプチャデバイスです.これは,v4l2-ctl コマンドを用いて,

$ v4l2-ctl --list-devices
Synaptics RMI4 Touch Sensor (rmi4:rmi4-00.fn54):
  /dev/v4l-touch0

USB Video: USB Video (usb-0000:00:14.0-2):
  /dev/video2
  /dev/video3
  /dev/media1

Integrated Camera: Integrated C (usb-0000:00:14.0-8):
  /dev/video0
  /dev/video1
  /dev/media0

のように調べます.上の例は Thinkpad X1 Carbon gen6 での実行例ですが,それぞれ以下に対応しているようです.

  • /dev/v4l-touch0: 指紋認証のタッチセンサー
  • /dev/vodeo0, 2: 内蔵Webカメラ/外付USBカメラ用のキャプチャデバイス
  • /dev/video1, 3: 内蔵Webカメラ/外付USBカメラ用のメタデーターデバイス
  • /dev/media0, 1: 内蔵Webカメラ/外付USBカメラ用のメディアデバイス

それぞれのデバイスの詳しい情報は,

$ v4l2-ctl -d /dev/video2 --info
Driver Info:
  Driver name      : uvcvideo
  Card type        : USB Video: USB Video
  Bus info         : usb-0000:00:14.0-2
  Driver version   : 5.19.17
  Capabilities     : 0x84a00001
    Video Capture
    Metadata Capture
    Streaming
    Extended Pix Format
    Device Capabilities
  Device Caps      : 0x04200001
    Video Capture
    Streaming
    Extended Pix Format
.....

で分かります.mplayer で使うのはキャプチャデバイスなので,使えるのは /dev/video0 と /dev/video1 です.

次のオプション「width=1280:height=720:fps=30:outfmt=yv12」ですが,

  • width: 取り込む映像の横の解像度(16の倍数,省略時は640)
  • height: 取り込む映像の縦の解像度(16の倍数,省略時は480)
  • fps: 取り込む映像のフレームレート
  • outfmt: 色の表現方法(省略時は yv12)

です.outfmt として指定できるのは,yv12, rgb32, rgb24, rgb16, rgb15, uyvy, yuy2, i420 などのようです.それぞれの違いについては,例えば

【AviUtl】未圧縮とYUY2との違いについて【YUV422、RGB】
このページでは、AviUtlにて「AVI出力(Ctrl+S)」で動画を出力する際の 「未圧縮」 「YUY2」の違いについて紹介します。無圧縮出力の使い道動画は通常、エンコードすればするほど画質が劣化していきます。しかし、「未圧縮」と「YUY

などの解説をご覧いただければと思いますが,ここで注意しないといけないことは,

ここで指定した形式がそのままキャプチャ・デバイスが取り込む形式として設定されるとは限らない

ことです.指定した形式にキャプチャ・デバイスが対応していないことがあるからです.そして対応していない場合,どうも mplayer は,

比較的近い形式をキャプチャ・デバイスに設定

するようです.したがって,V4L2 対応のキャプチャ・デバイスがどのような取込みの形式に対応しているのか,また,現在どのような取込み設定となっているのかを確認できるようにしておかないと,取り込んだは良いが,なぜか映像がなめらかに再生されないなどのトラブルに対応できません.

このうち,それぞれのキャプチャデバイスがどんな形式に対応しているのかは,取込みフォーマットだけなら,

$ v4l2-ctl -d /dev/video2 --list-formats                                                                    ✘ 1 
ioctl: VIDIOC_ENUM_FMT
  Type: Video Capture

  [0]: 'MJPG' (Motion-JPEG, compressed)
  [1]: 'YUYV' (YUYV 4:2:2)

のように,解像度やフレームレート含む形で知りたければ,

$ v4l2-ctl -d /dev/video2 --list-formats-ext                                                                ✘ 1 
ioctl: VIDIOC_ENUM_FMT
  Type: Video Capture

  [0]: 'MJPG' (Motion-JPEG, compressed)
    Size: Discrete 1920x1080
      Interval: Discrete 0.017s (60.000 fps)
      Interval: Discrete 0.033s (30.000 fps)
      Interval: Discrete 0.040s (25.000 fps)
      Interval: Discrete 0.050s (20.000 fps)
      Interval: Discrete 0.100s (10.000 fps)
    Size: Discrete 1600x1200
      Interval: Discrete 0.017s (60.000 fps)
      Interval: Discrete 0.033s (30.000 fps)
      Interval: Discrete 0.040s (25.000 fps)
      Interval: Discrete 0.050s (20.000 fps)
      Interval: Discrete 0.100s (10.000 fps)
...

のようにすれば分かります.また,現在設定されている取込みフォーマットは,まず,解像度と色設定については,

$ v4l2-ctl -d /dev/video2 -V                                                                              ✘ 255 
Format Video Capture:
  Width/Height      : 640/480
  Pixel Format      : 'MJPG' (Motion-JPEG)
  Field             : None
  Bytes per Line    : 0
  Size Image        : 614400
  Colorspace        : sRGB
  Transfer Function : Rec. 709
  YCbCr/HSV Encoding: ITU-R 601
  Quantization      : Default (maps to Full Range)
  Flags             :

のように,フレームレートについては,

$ v4l2-ctl -d /dev/video2 -P
Streaming Parameters Video Capture:
  Capabilities     : timeperframe
  Frames per second: 60.000 (60/1)
  Read buffers     : 0

のようにすれば見ることができます.

オプションの解説(音声)

次は音声に係る取込みオプションについてですが,手持ちの USB 接続の HDMI キャプチャ・デバイスの音声がなかなか出力されず,かなり苦労しました.

結果的に分かったことは,

mplayer で音声を再生する場合は,V4L2 デバイスから取り込んだ映像に音声が含まれているのか否かを気にしなければならない

ことでした.

私が所有している USB HDMI キャプチャ・デバイスもそうですし,一般的なウェブカメラなどもそうだと思いますが,Linux の場合,音声の取込みデバイスは映像とは別に alsa デバイスとして認識されます(多分 TV キャプチャカードなんかだと映像に音声を含める形で取り込めるのだと思う).つまり,

  1. V4L2 から取り込まれた映像には音声が含まれていないこと,
  2. 音声は alsa デバイスのものを使用すること
  3. 映像と音声の両方を取り込まなければならないこと

の3つを mplayer に指定しなければなりません.そして,上の1 に対応するのが forceaudio オプションで,2に対応するのが alsa オプション,そして3に対応するのが  immediatemode=0 オプションです(mencoder を使う場合は3番はデフォルトで設定されるらしい).

また,adevice オプションを adevice=hw.1 のように設定することで,どの alsa デバイスを使うのかを指定します.このとき,利用できる録音用のデバイスは,

$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: PCH [HDA Intel PCH], デバイス 0: ALC285 Analog [ALC285 Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: MS2109 [MS2109], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

のように調べることができ,この例の場合は,

  • adevice=hw:1
  • adevice=hw:1.0
  • adevice=hw:MS2109
  • adevice=hw:MS2109.0

は同じ意味になります.

残りのオプションのうち,audiorate=48000 ですが,これはもちろん取り込むオーディオのサンプリングレート指定を 48000 Hz とするという指定です.HDMI の場合,基本的にサンプリングレートはこの値のはずなので,この部分は特にいじる必要はないのではないかなと思います.

雑感

さて,ここまで mplayer のオプションについて分かったことを記しましたが,これだけでも理解するのにかなり時間がかかってしまいました.

これは,上の解説を見ていただくと分かるとおり,mplayer が V4L2 とか ALSA とかにベッタリ依存していること,また,この辺りについてわかり易く説明している文章があるようでない(単に私の調べ方が悪くて見つけられていないだけかもしれませんが)からです.そして,恐ろしいことに,ここに記したものは mplayer のオプションの極めて一部でしかありません.正直,永遠に mplayer 使いこなせる気がしません.

まぁしかしこれは Unix 系のコマンド全般がそんな感じな気もしますね.

以上!

EnvironmentGadget
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました