Video for Linux 2 に関する情報ページ

Count:77990
最終更新日:2012/04/23

Video for Linux two (V4L2,Video4Linux2)についての情報をまとめています。 現時点ではまだ個人的なメモの列挙にしかなっていませんが、 少しでも皆さんの参考になれば幸いです。

情報が増えてきたら別ページ化を考えますが、現時点では情報が少ないので このまま1ページにまとめます。

このページを読む前提として

このページを読むには、かなりの知識が必須と思います。
特にLinuxのCUIをはじめ、一般的なソフトのインストール、 コンパイルについては詳細は既に他の解説が詳しいと思いますので、 ここではV4L2に関する情報のみに絞り、ばっさり割愛します。
出来る限り分かりやすくなるように表記するつもりですが、 もともと私自身の理解のために書いた資料をまとめたものなので、 一部分かりにくい表記があるかもしれません。

V4L2の概要

V4L2(Video for Linux 2)は、V4L(Video for Linux)の後継。 Linux上でビデオを扱うための統一的なAPI。 V4Lは既に過去のものとなっており、 今後はV4L2のみサポートされることが推奨されている。 特にUVCカメラドライバ(uvcvideo)はV4L2のみサポートすることが明言されている。
V4L(Video for Linux)との互換性は無い。完全に別々のもの。

インストール

最近のlinux(Linux 2.6.26以降)だと、 V4L2、UVCカメラドライバは既にカーネルに含まれている模様。
以下、私の確認したディストリビューション
自力でカーネルにインストールする方法、もしくはドライバのアップデート方法 は不明。

セキュリティ権限

video,audioグループに所属することで、カメラへのアクセスが可能になる。 グループに属しなくても、suしたり、sudoしたりすることで、一時的な扱い は可能。
注:上記の記述は私の環境(ubuntu)で確認したことなので、他の環境では異なる 可能性があります

動作確認

「ffmpeg」を動かしてみるのが一番簡単か。
$ffmpeg -f alsa -i hw:1 -f video4linux2 -s 320x240 -i /dev/video0 out.mpg
で、とりあえずout.mpgに音声も含めて録音できるはず。
あくまで私の環境ですが、上記コマンドで動作を確認しました。 おそらく環境によって数字とかを微妙に変更しないと動作しないと思われる。


X11も動いている環境だと、「luvcview」というコマンドでも確認できる。

プログラム

サンプルプログラム(ソース含む)は以下に存在。 とりあえず、このサンプルを基にいじくりまくって、 まずカメラの性能表を表示するプログラムを作ってみた。 ソースのダウンロード
普通にgccでコンパイルできるはず・・・ コンパイル時に付加しなければならないオプションは特にありません。
単純に「gcc -o listup listup.c」でOK。

使い方
$listup 0
引数はカメラの番号(/dev/videoの後の数字)。0番から始まる。
結果表示例:(ubuntu 10.10 + ELECOM UCAM-DLY300TA)
Using camera #0
Camera : /dev/video0
Driver name     : uvcvideo
Driver Version  : 0.1.0
Device name     : UCAM-DLY300TA
Bus information : usb-0000:00:1d.7-7
Capabilities    : 04000001h
                      V4L2_CAP_VIDEO_CAPTURE (Video Capture) : OK
                        V4L2_CAP_VIDEO_OUTPUT (Video Output) : Not supported.
                      V4L2_CAP_VIDEO_OVERLAY (Video Overlay) : Not supported.
                      V4L2_CAP_VBI_CAPTURE (Raw VBI Capture) : Not supported.
                        V4L2_CAP_VBI_OUTPUT (Raw VBI Output) : Not supported.
            V4L2_CAP_SLICED_VBI_CAPTURE (Sliced VBI Capture) : Not supported.
              V4L2_CAP_SLICED_VBI_OUTPUT (Sliced VBI Output) : Not supported.
            V4L2_CAP_RDS_CAPTURE (Undefined.[to be defined]) : Not supported.
  V4L2_CAP_VIDEO_OUTPUT_OVERLAY (Video Output Overlay (OSD)) : Not supported.
                                      V4L2_CAP_TUNER (Tuner) : Not supported.
                    V4L2_CAP_AUDIO (Audio inputs or outputs) : Not supported.
                             V4L2_CAP_RADIO (Radio receiver) : Not supported.
                V4L2_CAP_READWRITE (Read/write() I/O method) : Not supported.
                  V4L2_CAP_ASYNCIO (Asynchronous I/O method) : Not supported.
                   V4L2_CAP_STREAMING (Streaming I/O method) : OK

Ctrl id(CID) : 00980900h (V4L2_CID_BRIGHTNESS)
	Ctrl name : Brightness
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : -10,10,1,3
	Flags    : 00000000h
Ctrl id(CID) : 00980901h (V4L2_CID_CONTRAST)
	Ctrl name : Contrast
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,20,1,10
	Flags    : 00000000h
Ctrl id(CID) : 00980902h (V4L2_CID_SATURATION)
	Ctrl name : Saturation
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,10,1,5
	Flags    : 00000000h
Ctrl id(CID) : 0098090ch (V4L2_CID_AUTO_WHITE_BALANCE)
	Ctrl name : White Balance Temperature, Auto
	Ctrl type : 2 (V4L2_CTRL_TYPE_BOOLEAN)
	Min,Max,Step,Default : 0,1,1,1
	Flags    : 00000000h
Ctrl id(CID) : 00980910h (V4L2_CID_GAMMA)
	Ctrl name : Gamma
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 100,200,1,170
	Flags    : 00000000h
Ctrl id(CID) : 00980918h (V4L2_CID_POWER_LINE_FREQUENCY)
	Ctrl name : Power Line Frequency
	Ctrl type : 3 (V4L2_CTRL_TYPE_MENU)
		  Menu items:
		  0 : Disabled
		  1 : 50 Hz
		  2 : 60 Hz
	Min,Max,Step,Default : 0,2,1,2
	Flags    : 00000000h
Ctrl id(CID) : 0098091ah (V4L2_CID_WHITE_BALANCE_TEMPERATURE)
	Ctrl name : White Balance Temperature
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 2800,6500,1,6500
	Flags    : 00000000h
Ctrl id(CID) : 0098091bh (V4L2_CID_SHARPNESS)
	Ctrl name : Sharpness
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,10,1,0
	Flags    : 00000000h
Ctrl id(CID) : 009a0901h (V4L2_CID_EXPOSURE_AUTO)
	Ctrl name : Exposure, Auto
	Ctrl type : 3 (V4L2_CTRL_TYPE_MENU)
		  Menu items:
		  0 : Auto Mode
		  1 : Manual Mode
		  2 : Shutter Priority Mode
		  3 : Aperture Priority Mode
	Min,Max,Step,Default : 0,3,1,3
	Flags    : 00000000h
Ctrl id(CID) : 009a0902h (V4L2_CID_EXPOSURE_ABSOLUTE)
	Ctrl name : Exposure (Absolute)
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 8,16384,1,512
	Flags    : 00000000h
Ctrl id(CID) : 009a090ah (V4L2_CID_FOCUS_ABSOLUTE)
	Ctrl name : Focus (absolute)
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,20,1,10
	Flags    : 00000000h
Ctrl id(CID) : 009a090ch (V4L2_CID_FOCUS_AUTO)
	Ctrl name : Focus, Auto
	Ctrl type : 2 (V4L2_CTRL_TYPE_BOOLEAN)
	Min,Max,Step,Default : 0,1,1,1
	Flags    : 00000000h

Image format #0 : YUYV (YUV 4:2:2 (YUYV))
  0: (640 x 480)     1/30
  1: (352 x 288)     1/30
  2: (320 x 240)     1/30
  3: (176 x 144)     1/30
  4: (160 x 120)     1/30
  5: (2048 x 1536)     2/5
  6: (1280 x 1024)     2/15
  7: (1600 x 1200)     1/5
Image format #1 : MJPG (MJPEG)
  0: (640 x 480)     1/30
  1: (352 x 288)     1/30
  2: (320 x 240)     1/30
  3: (176 x 144)     1/30
  4: (160 x 120)     1/30
  5: (2048 x 1536)     1/15
  6: (1920 x 1080)     1/15
  7: (1280 x 1024)     1/15
  8: (1600 x 1200)     1/15
結果表示例:(ubuntu 10.10 + Logicool 2-MP Portable Webcam C905m)
Using camera #1
Camera : /dev/video1
Driver name     : uvcvideo
Driver Version  : 0.1.0
Device name     : UVC Camera (046d:080a)
Bus information : usb-0000:00:1d.7-8
Capabilities    : 04000001h
                      V4L2_CAP_VIDEO_CAPTURE (Video Capture) : OK
                        V4L2_CAP_VIDEO_OUTPUT (Video Output) : Not supported.
                      V4L2_CAP_VIDEO_OVERLAY (Video Overlay) : Not supported.
                      V4L2_CAP_VBI_CAPTURE (Raw VBI Capture) : Not supported.
                        V4L2_CAP_VBI_OUTPUT (Raw VBI Output) : Not supported.
            V4L2_CAP_SLICED_VBI_CAPTURE (Sliced VBI Capture) : Not supported.
              V4L2_CAP_SLICED_VBI_OUTPUT (Sliced VBI Output) : Not supported.
            V4L2_CAP_RDS_CAPTURE (Undefined.[to be defined]) : Not supported.
  V4L2_CAP_VIDEO_OUTPUT_OVERLAY (Video Output Overlay (OSD)) : Not supported.
                                      V4L2_CAP_TUNER (Tuner) : Not supported.
                    V4L2_CAP_AUDIO (Audio inputs or outputs) : Not supported.
                             V4L2_CAP_RADIO (Radio receiver) : Not supported.
                V4L2_CAP_READWRITE (Read/write() I/O method) : Not supported.
                  V4L2_CAP_ASYNCIO (Asynchronous I/O method) : Not supported.
                   V4L2_CAP_STREAMING (Streaming I/O method) : OK

Ctrl id(CID) : 00980900h (V4L2_CID_BRIGHTNESS)
	Ctrl name : Brightness
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,255,1,128
	Flags    : 00000000h
Ctrl id(CID) : 00980901h (V4L2_CID_CONTRAST)
	Ctrl name : Contrast
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,255,1,32
	Flags    : 00000000h
Ctrl id(CID) : 00980902h (V4L2_CID_SATURATION)
	Ctrl name : Saturation
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,255,1,28
	Flags    : 00000000h
Ctrl id(CID) : 0098090ch (V4L2_CID_AUTO_WHITE_BALANCE)
	Ctrl name : White Balance Temperature, Auto
	Ctrl type : 2 (V4L2_CTRL_TYPE_BOOLEAN)
	Min,Max,Step,Default : 0,1,1,1
	Flags    : 00000000h
Ctrl id(CID) : 00980913h (V4L2_CID_GAIN)
	Ctrl name : Gain
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,255,1,0
	Flags    : 00000000h
Ctrl id(CID) : 00980918h (V4L2_CID_POWER_LINE_FREQUENCY)
	Ctrl name : Power Line Frequency
	Ctrl type : 3 (V4L2_CTRL_TYPE_MENU)
		  Menu items:
		  0 : Disabled
		  1 : 50 Hz
		  2 : 60 Hz
	Min,Max,Step,Default : 0,2,1,2
	Flags    : 00000000h
Ctrl id(CID) : 0098091ah (V4L2_CID_WHITE_BALANCE_TEMPERATURE)
	Ctrl name : White Balance Temperature
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,10000,10,4000
	Flags    : 00000000h
Ctrl id(CID) : 0098091bh (V4L2_CID_SHARPNESS)
	Ctrl name : Sharpness
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,255,1,191
	Flags    : 00000000h
Ctrl id(CID) : 0098091ch (V4L2_CID_BACKLIGHT_COMPENSATION)
	Ctrl name : Backlight Compensation
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 0,1,1,1
	Flags    : 00000000h
Ctrl id(CID) : 009a0901h (V4L2_CID_EXPOSURE_AUTO)
	Ctrl name : Exposure, Auto
	Ctrl type : 3 (V4L2_CTRL_TYPE_MENU)
		  Menu items:
		  0 : Auto Mode
		  1 : Manual Mode
		  2 : Shutter Priority Mode
		  3 : Aperture Priority Mode
	Min,Max,Step,Default : 0,3,1,3
	Flags    : 00000000h
Ctrl id(CID) : 009a0902h (V4L2_CID_EXPOSURE_ABSOLUTE)
	Ctrl name : Exposure (Absolute)
	Ctrl type : 1 (V4L2_CTRL_TYPE_INTEGER)
	Min,Max,Step,Default : 1,10000,1,166
	Flags    : 00000000h
Ctrl id(CID) : 009a0903h (V4L2_CID_EXPOSURE_AUTO_PRIORITY)
	Ctrl name : Exposure, Auto Priority
	Ctrl type : 2 (V4L2_CTRL_TYPE_BOOLEAN)
	Min,Max,Step,Default : 0,1,1,0
	Flags    : 00000000h

Image format #0 : YUYV (YUV 4:2:2 (YUYV))
  0: (640 x 480)     1/30 1/25 1/20 1/15 1/10 1/5
  1: (160 x 120)     1/30 1/25 1/20 1/15 1/10 1/5
  2: (176 x 144)     1/30 1/25 1/20 1/15 1/10 1/5
  3: (320 x 240)     1/30 1/25 1/20 1/15 1/10 1/5
  4: (352 x 288)     1/30 1/25 1/20 1/15 1/10 1/5
  5: (640 x 360)     1/30 1/25 1/20 1/15 1/10 1/5
  6: (640 x 400)     1/30 1/25 1/20 1/15 1/10 1/5
  7: (768 x 480)     1/25 1/20 1/15 1/10 1/5
  8: (800 x 456)     1/25 1/20 1/15 1/10 1/5
  9: (800 x 504)     1/25 1/20 1/15 1/10 1/5
  10: (800 x 600)     1/25 1/20 1/15 1/10 1/5
  11: (864 x 480)     1/25 1/20 1/15 1/10 1/5
  12: (960 x 720)     1/15 1/10 1/5
  13: (1280 x 720)     2/15 1/5
  14: (1280 x 800)     2/15 1/5
  15: (1600 x 904)     1/5
  16: (1600 x 1000)     1/5
  17: (1600 x 1200)     1/5
Image format #1 : MJPG (MJPEG)
  0: (640 x 480)     1/30 1/25 1/20 1/15 1/10 1/5
  1: (160 x 120)     1/30 1/25 1/20 1/15 1/10 1/5
  2: (176 x 144)     1/30 1/25 1/20 1/15 1/10 1/5
  3: (320 x 240)     1/30 1/25 1/20 1/15 1/10 1/5
  4: (352 x 288)     1/30 1/25 1/20 1/15 1/10 1/5
  5: (640 x 360)     1/30 1/25 1/20 1/15 1/10 1/5
  6: (640 x 400)     1/30 1/25 1/20 1/15 1/10 1/5
  7: (768 x 480)     1/30 1/25 1/20 1/15 1/10 1/5
  8: (800 x 456)     1/30 1/25 1/20 1/15 1/10 1/5
  9: (800 x 504)     1/30 1/25 1/20 1/15 1/10 1/5
  10: (800 x 600)     1/30 1/25 1/20 1/15 1/10 1/5
  11: (864 x 480)     1/30 1/25 1/20 1/15 1/10 1/5
  12: (960 x 720)     1/30 1/25 1/20 1/15 1/10 1/5
  13: (1280 x 720)     1/30 1/25 1/20 1/15 1/10 1/5
  14: (1280 x 800)     1/25 1/20 1/15 1/10 1/5
  15: (1600 x 904)     1/10 1/5
  16: (1600 x 1000)     1/10 1/5
  17: (1600 x 1200)     1/10 1/5
意味はとりあえず以下のとおり。
カメラに関する各種情報。ドライバ名、バージョンなど。
Capabilityが少々複雑だがサポートしている要素を挙げている。

イメージフォーマット。今のところYUYVとMJPGしか確認できていない。
次は解像度。
最後の分数は、取り込みフレーム間隔。単位は秒。

カメラデータ取り込み方法

カメラの画像データを取り込むには以下の4通りの方法がある。
  1. 直接読み込み(Read/Write)
  2. メモリーマッピング(Streaming I/O, Memory Mapping, mmap)
  3. ユーザーポインタ(Streaming I/O, User Pointers)
  4. 非同期(Asynchronous I/O)
私の環境ではメモリーマッピング以外は動作が確認できず。 非同期に至ってはサンプルにすら無い。

フォーマット

YUYV(V4L2_PIX_FMT_YUYV ('YUYV'))

Windowsでは'YUY2'と同等らしい。

4バイトで2ピクセルの色情報。Y0,Cb,Y1,Cr という順番の並びで
1ピクセル目は Y0,Cb,Cr の色
2ピクセル目は Y1,Cb,Cr の色

横のピクセル数が奇数の場合は分からない・・・(たぶん無い気がする)

MJPG(V4L2_PIX_FMT_JPEG)

VIDIOC_G_JPEGCOMP, VIDIOC_S_JPEGCOMPも参照とあるが、詳細不明。
とりあえず、セットしてみたら動いた。 カメラによって出てくるデータが微妙に異なり、 1枚でも完全なJPEGとして再生できるものから、 一部ハフマンテーブルを省略してあり表示できないものまで様々。 詳細はもう少し調べてみる必要がありそう。
各フレーム毎にサイズが異なる可変長になっている。

コントロールID(CID)

定義:V4L2_CID_????
通常のUserCIDは「V4L2_CID_BASE以上 V4L2_CID_LASTP1未満」の範囲とある。
しかし、それ以外の範囲 「V4L2_CID_CAMERA_CLASS_BASE+1~V4L2_CID_CAMERA_CLASS_BASE+19」にも 定義があり、使えそうなのが判明。
これはどうやら、拡張CID(Extended Controls)の範囲ということのようだが、 詳細不明。もう少し調べてみる。
例えばカメラのシャッタースピードを固定したい時、以下のようになる。
  1. 「V4L2_CID_EXPOSURE_AUTO」で1 : Manual Modeを設定。
  2. 「V4L2_CID_EXPOSURE_ABSOLUTE」で露出時間を設定。
セットする順番は重要っぽい。 「V4L2_CID_EXPOSURE_AUTO」が 0 : Auto Modeのまま、 先に「V4L2_CID_EXPOSURE_ABSOLUTE」をセットしようとした場合、 エラーになる。

画像取り込みプログラム

とりあえず作成。カメラのYUVフォーマットのまま保存。 実行の都度capture.yuvに必ず上書きするので注意。
ソースのダウンロード
なぜかバイトオーダーが違ってた(2バイト毎に交換しないといけない)ので、 プログラム中で変換してます。というか、もともとそういうフォーマット?
あと、最初の5~6枚はカメラの初期化が間に合ってないのか変な色になって しまうので、10枚ほど空読みしてから、1枚読み込んでファイルに保存してる。

動画ファイルとしてたくさん保存するバージョンも作ってみたが HDDがかなり高速でないと(SSD推奨)ファイル書き込み速度がたぶん間に合わない。
ソースのダウンロード
SSDで実際に動いた。今度は4Gバイト以上書き込めない状況で、プログラム上は動作 しているように見えるが、実際にはそれ以降は記録されてない状態になった。 まぁそこまでやる人は居ない(VGAサイズの場合2分弱でオーバーするかな)と思う のでここではそのままにしておきます・・・

その他参考ページ

日本語ページ

英語ページ


サイバラのプログラムなページに戻る
サイバラのホームページへ

E-mail address : saibara@big.or.jp