Linuxの2(Video4Linux2)のためのビデオはV4L2、V4L2は、画像を取得するためのLinuxオペレーティングシステムであり、適切なビデオキャプチャデバイスおよび対応するドライバと、映像と音声のデータへのAPIインタフェースは、画像、ビデオ、オーディオなどを実現することができます言及しましたコレクション。遠隔会議、ビデオ電話、ビデオ監視システムと組み込みマルチメディア端末でアプリケーションの広い範囲を持っています。
一、ビデオ用のLinux 2
Linuxでは、すべての周辺機器を使用すると、読み書きに通常のファイルと同様にアクセスできるファイルの特別な種類の、「デバイスファイル」、と見られています。一般的に、カメラ駆動装置V4L2ファイルを使用しての/ dev / V4L / video0です。GMのために、あなたはのは/ dev / video0へのリンクを作成することができます。メモリマッピングモード(MMAP)とダイレクトアクセス(読み込み):V4L2は、画像をキャプチャする2つの方法をサポートしています。V4L2は、これらのデータの操作によって、最終的な画像データを得るために、すなわち、重要なデータ構造の数は、画像の収集中/リナックス/ videodev.h文書を含む定義します。Linuxシステムでは、デフォルトでは、この開発のインタフェースを持って、Linuxカーネルのコンパイル段階でV4L2機能を設定することができます。V4L2は、Linux 2.5.xのカーネルのバージョンから現れ始めました。
V4L2仕様のみ入力/出力方式(入力/出力)、汎用API要素(共通APIエレメント)、画像フォーマット(画像フォーマット)を規定する、Linuxカーネルドライバは、ビデオ情報インタフェース(インタフェース)、一連の処理を定義し、これらのインターフェイスは、次のとおりです。
ビデオキャプチャインタフェース--Videoキャプチャインターフェイス。
ビデオ出力インターフェース - ビデオ出力インタフェース;
ビデオオーバーレイ/プレビュー--Videoオーバーレイインターフェイスをインタフェースします。
ビデオ出力インタフェースは--Video出力オーバーレイインターフェイスをカバーします。
コーデックインタフェース--Codecインタフェース。
V4L2によってビデオキャプチャの原則の第二に、アプリケーション
V4L2のサポートメモリマップモード(MMAP)と、データを収集するためのダイレクト読み込みモード(読み取り)、多くの場合、静止画のデータを収集するために使用されたビデオデータの連続キャプチャの元ゼネラル、ビデオキャプチャ記事は、メモリマップモードに焦点を当てています。
5つのステップアプリケーション・インターフェースのV4L2キャプチャ映像データを介して:
まず、デバイスは、ドットサイズ及びフォーマットを収集パラメータ初期化ビデオキャプチャ、インターフェースV4L2によって提供される映像取得ウィンドウを行うビデオファイルを開きます。
次に、ビデオキャプチャフレームバッファの数、およびユーザ空間へのカーネル空間からフレームバッファのマッピングを適用し、アプリケーションの読み取り/処理されたビデオデータを容易にします。
第三に、入力ビデオキャプチャフレームバッファ待ち行列への適用、およびビデオキャプチャ開始。
第四に、ドライブは、処理後のビデオキャプチャフレームバッファ出力キュー、バック入力キューにビデオキャプチャフレームバッファビデオデータをキャプチャするために使用されるサイクルから取られたビデオデータのアプリケーションを収集を開始します。
第五に、ビデオキャプチャを停止します。
1.ビデオキャプチャを初期化
Linuxの場合、カメラは、ハードウェア・デバイス・ファイル「は/ dev / video0」にマッピングされている、ファイルオープン機能デバイスを開き、そのファイルディスクリプタがfd_v4l2、このパラメータの初期化ファイル記述子を取得しています。
(1)ビデオを提供されるパラメータ取得ウィンドウ
収集窓は、カメラ装置の撮影範囲内の映像取り込み領域を設定するために設けられています。主構造はv4l2_crop v4l2_buffer_type、v4l2_crop割当された映像取得ウィンドウの種類とサイズを記述するために、列挙型および構造型v4l2_rect Cの種類によって構成される。ビデオキャプチャV4L2_BUF_TYPE_VIDEO_CAPTUREのタイプとして設定と入力します。Cは、構造取得ウィンドウのサイズであり、そのメンバー左上それぞれ横軸および縦軸は、開始ビデオキャプチャ領域は、幅と高さは、画像取得の幅と高さを表して表します。割り当て後、この構造を使用してfd_v4l2 ioctl関数を設定します。
構造体v4l2_crop {列挙v4l2_buf_type型。
構造体v4l2_rectのC;
}。
(2)ビデオフォーマットとドットのドットサイズを設定します
主構造体は割り当てv4l2_formatであり、現在の動作形式のビデオおよびデータ機器を記述するために、型FMTコンソーシアムから成ります。
ビデオキャプチャ型V4L2_BUF_TYPE_VIDEO_CAPTUREのタイプに割り当てられ、ビデオキャプチャバッファのストリーム型の定義を意味します。FMTにおける、PIXのv4l2_pix_format型構造は、グラフィック形式です。サイズをバイト数で示す画像によって占有sizeimage記憶空間、PIXは、いくつかの変数に設定する必要があり、PixelFormatプロパティはV4L2_PIX_FMT_YUV420に、キャプチャ形式を表す;画像の幅の幅、高さの表現、高さ、バイト; bytesperline行あたりのバイト数。割り当て後、ioctl関数でこの構造によってFD_ V4L2を設定します。
構造体v4l2_format
{列挙v4l2_buf_type型。
連合
{構造体v4l2_pix_formatのPIX。// V4L2_BUF_TYPE_VIDEO_CAPTURE
構造体には勝つv4l2_window。// V4L2_BUF_TYPE_VIDEO_OVERLAY
__u8 RAW_DATA [200]。// ユーザー定義の
} FMT。
}。
(3)ビデオキャプチャのフレームレートを設定します
ビデオストリームのV4l2_streamparm構造属性がタイプ及び連邦PARMで構成され、説明されるであろう。選挙はこれだけ設定v412_capture型構造は、PARMをキャプチャすることができ、V4L2_BUF_TYPE_VIDEO_CAPTUREであることから、上記と入力します。前記要素によって各フレーム時間、分子と分母の平均百分率で表されるv4l2_fract timeperframe型構造は一緒に分子/分母の持続時間を決定し、capturemode及び取得モードを前記高品質な画像の取得が、一般的な1でありますこれは、0に設定されています。割り当て後、ioctl関数でこの構造によってFD_ V4L2を設定します。
構造体v4l2_streamparm
{列挙v4l2_buf_type型。
連合
{構造体v4l2_captureparmキャプチャ;
構造体v4l2_outputparm出力。
__u8 RAW_DATA [200]。/* ユーザー定義の */
} PARM。
}。
2.アプリケーションおよびビデオキャプチャフレームバッファ提供
初期化は、単にビデオデータのサイズと形式の問題を解決するために、早期終了、およびビデオフレームデータ取得は、メモリ内のいくつかのフレームバッファを適用する、すなわち運転者が、フレーム・バッファ・キューを解決するために連続的な方法を必要とされた後ビデオデータを格納します。
方法(VIDIOC_REQBUFS)APIインタフェースによりアプリケーションのアプリケーション・データのビデオ・フレーム・バッファの複数を提供する、フレームバッファは、一般に、アプリケーションの数が3以上である、ビデオ・フレーム・バッファのデータを格納する各カーネルのフレームバッファスペース。
アプリケーションは、フレーム・バッファ・アドレスへの長さを照会し、照会方法設け(VIDIOC_QUERYBUF)APIインタフェースによってカーネル空間でオフセット。
メモリマッピング方法(MMAP)を介して、アプリケーションは、ユーザのアドレス空間にフレームバッファカーネル空間に適用されるアドレスにマッピングされるので、フレームバッファにデータを直接処理することができます。
(1)フレームバッファビデオ入力待ち行列に、およびビデオキャプチャ開始
ビデオドライバの処理中に、2つのキューを定義:ビデオキャプチャ入力キュー(受信キュー)ビデオキャプチャと出力キュー(送信キュー)を、前者は運転者が置いたある映像データ待ち行列を格納するように駆動されますキューにビデオデータ。図に示すように。
アプリケーションを起動することができ、入力キューイング(VIDIOC_QBUF)ビデオキャプチャやビデオキャプチャにフレームバッファを必要とします。
(2)周期的、連続ビデオ・データを収集します
データ収集を開始するために、ビデオキャプチャドライバを起動した後、ビデオキャプチャ入力に収集されたデータは、データ収集が完了すると、第1のフレームバッファをキュー即ち、第1のフレームバッファは、フルフレームデータとなります運転者がビデオキャプチャフレームバッファ出力キューを移動した後、アプリケーションのための待機は、出力キューから削除されます。次のフレームバッファがデータの一杯になった後、次のデータ収集のドライバ次のフレームは、フレームバッファ、同じフレーム内に第二に、それは、出力キュービデオキャプチャに配置されます。
アプリケーションは、メモリや圧縮などのフレームバッファ内のビデオデータを、処理、ビデオデータを含むビデオキャプチャフレームバッファ出力キューから除去されます。
最後に、アプリケーションは、図1に示すように周期が、取得することができるように、背面入力キューへのフレームバッファの完全な捕捉された映像データを処理します。
図1のビデオキャプチャ入力および出力キューイング
(3)最後に、取得を停止するメモリ・フレーム・バッファを解放します
3.ビデオキャプチャプログラムの流れとAPIに関連したV4L2
オープンビデオに実質的に従って、動作V4L2ビデオキャプチャデバイス、ビデオフォーマットが提供され、ビデオキャプチャ、ビデオ機器の近く、他の機能によって達成IOCTL特定動作を停止、ビデオキャプチャ、ビデオデータのループ処理を開始します。次のように一般的な手順は次のとおりです。
(1)オープンV機器。int型のfd =オープン( "は/ dev / video0"、O_RDWR);
(2)このような入力ビデオまたはオーディオ入力および出力するかどうかのような映像機器を照会する能力。ioctl(fd_v4l、VIDIOC_QUERYCAP、&キャップ)
(3)ビデオキャプチャのパラメータを設定します
標準PAL / NTSCを含むビデオフォーマットの設定、IOCTL(fd_v4l、VIDIOC_S_STD、&std_id)を使用し
ioctlを使用してサイズのビデオ画像キャプチャウィンドウ(fd_v4l、VIDIOC_S_CROP、&トリミング)
IOCTL(fd_v4l、VIDIOC_S_FMT、&FMT)を使用して提供されるビデオ・フレーム・フォーマット、ドット、幅及び高さを含むフレームフォーマット、
ioctl(fd_v4l、VIDIOC_S_PARM、&PARM)を使用して、ビデオのフレームレートを設定します
回転自在のioctlを使用して提供されたビデオ(fd_v4l、VIDIOC_S_CTRL、&CTRL)
(4)駆動フレームバッファビデオストリームデータに適用
要求/アプリケーションIOCTLを使用して、3より典型的にはいくつかのフレームバッファ、(fd_v4l、VIDIOC_REQBUFS、&REQ)
カーネルスペース長の問合せフレームバッファとIOCTL(fd_v4l、VIDIOC_QUERYBUF、&BUF)をオフセット
(5)メモリ・マッピング・アプリケーションを介して、ユーザへのフレームバッファアドレス空間のマッピングを、操作、コピーすることなく、フレームに直接収集することができるようになっています。
バッファ[i]は.start =のmmap(NULL、バッファ[i]を.LENGTH、PROT_READ | PROT_WRITE、MAP_SHARED、fd_v4l、バッファ[i]の.offset)。
(6)データの収集を記憶するためのすべての出力キューにビデオキャプチャフレームバッファへの応用。ioctl(fd_v4l、VIDIOC_QBUF、&bufが)
(7)ビデオストリームデータの取得が開始されます。ioctl(fd_v4l、VIDIOC_STREAMON、&タイプ)
(8)ビデオキャプチャ出力キューの後にメモリに入力キューのビデオ・フレーム・バッファに収集されたデータ、フレームバッファを駆動します。
(9)アプリケーション・フレームを削除するバッファは、既にビデオキャプチャ出力キューから収集されたデータを含んでいます。IOCTL(fd_v4l、VIDIOC_DQBUF、&BUF)、アプリケーションは、生のビデオ・フレーム・バッファのデータを処理します。
彼らはデータを収集するためにリサイクルすることができるように、再度アプリケーションの入力キューに、フレームバッファを処理した後(10)。ioctl(fd_v4l、VIDIOC_QBUF、&bufが)
それはデータの収集を停止するまで、上記の手順8〜10を繰り返します。
(11)ビデオコレクションを停止します。ioctl(fd_v4l、VIDIOC_STREAMOFF、&タイプ)
(12)アプリケーションは、ビデオ・フレーム・バッファ・アンマップ、近いV機器近い(fd_v4l)を放出します。
上記プログラムフロー、ビデオキャプチャ論理連続するビデオデータを備える装置。実際には、彼らはしばしば、映像データの処理に参加する仕事をしなければならない、そうでない場合は、ビデオストリームのデータ量が非常に大きい(例えば圧縮符号化など)、それはストレージ容量と伝送帯域幅を多く必要とします。
上述したプロセスは、各フレームは、各ビットが状態を表し、対応するバッファ状態フラグ変数を有します
V4L2_BUF_FLAG_UNMAPPED 0B0000
V4L2_BUF_FLAG_MAPPED 0B0001
V4L2_BUF_FLAG_ENQUEUED 0B0010
V4L2_BUF_FLAG_DONE 0B0100
図に示すように、バッファ変換。
図2、図変換バッファステータスフラグ