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 に -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 などのようです.それぞれの違いについては,例えば
などの解説をご覧いただければと思いますが,ここで注意しないといけないことは,
ここで指定した形式がそのままキャプチャ・デバイスが取り込む形式として設定されるとは限らない
ことです.指定した形式にキャプチャ・デバイスが対応していないことがあるからです.そして対応していない場合,どうも 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 キャプチャカードなんかだと映像に音声を含める形で取り込めるのだと思う).つまり,
- V4L2 から取り込まれた映像には音声が含まれていないこと,
- 音声は alsa デバイスのものを使用すること
- 映像と音声の両方を取り込まなければならないこと
の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 系のコマンド全般がそんな感じな気もしますね.
以上!