前回は単なる前振りで中身ショボっって思った人もいるかも(汗)
今回からはがっつり中身だよぉ(^^)v もっとも一度もUVCの規格書見たこと無い人やUVC関連のプログラムをしたことのない人にはさっぱりだったりして^^;
UVC規格での映像フォーマットについて
UVC規格でのh.264の取り扱いについて書く前に、UVC規格での映像フォーマットについて簡単に書きます。
USB規格に準拠した機器では、その機器が対応している機能についてデバイスディスクリプタと呼ばれるバイナリデータを読み取ることが出来ます。デバイスディスクリプタは大きく分けて次の3種類があります。
- USB機器共通の標準ディスクリプタ(Standard Descriptor)
- デバイスクラス固有のクラスディスクリプタ(Class Specific Descriptor)
- ベンダーが独自に定義したベンダーディスクリプタ(Vendor Specific Descriptor)
それぞれのディスクリプタは更な細かく分類されるのですが、UVC(=USB Video Class)機器が対応している映像フォーマットはクラスディスクリプタのペイロードフォーマットディスクリプタ(Payload Format Descriptor)とビデオフレームディスクリプタ(Video Frame Descriptor)を解析することで取得することが出来ます。
UVC1.5規格のペイロードフォーマットディスクリプタでは次の11種類が定義されています。
UVC1.5 Specification:Table3-16 Payload Format Descriptorから
- Uncompressed Video
- MJPEG Video
- MPEG1-SS
- MPEG2-PS
- MPEG-2 TS
- H.264
- VP8(UVC1.1では未定義)
- SMTPE VC1
- MPEG-4 SL
- DV
- Vendor Defined
また、UVC1.5規格のビデオフレームディスクリプタでは次の4種類が定義されています。
UVC1.5 Specification:Table3-17 Defined Video Frame Descriptor Resourcesから
- Uncompressed
- MJPEG
- Generic Frame-Based
- H.264(UVC1.1では未定義)
- VP8(UVC1.1では未定義)
それぞれの定義の詳細は省略することにしますが、UVC規格に対応したほぼすべてのWebカメラで非圧縮フォーマット(Uncompressed Video)に対応しています。また多くの場合MJPEG Videoフォーマットにも対応しています。
非圧縮フォーマット(Uncompressed Video)としてはYUY2, NV12, M420, I420の4種類が定義されています。つまり非圧縮フォーマットと言いながら実際にはピクセル単位で圧縮されたフォーマットなのです。とは言うものの例えばYUY2フォーマットの場合は1ピクセルあたり2バイト必要で解像度が1280×720では1フレームあたり約1.800メガバイト、1920×1080だと約4メガバイトを毎フレーム転送することになります。ですので解像度の大きな映像を高フレームレートで転送するのには向きません。
そこで使われるのがMJPEG Videoフォーマットで、フレーム毎にJPEG圧縮した映像フォーマットになります。設定によりますが少なくとも非圧縮フォーマットの1/4〜1/5程度のデータサイズになるのでより高解像度の映像を高フレームレートで転送することが出来ます。
ところで、先ほどの2つのリストには「H.264」と項目がありました。なのでこれだけを見るとYUY2やMJPEGと同じようにフォーマットディスクリプタとフレームディスクリプタを解析すればH.264で映像取得できるんやな、と思ってしまうかもしれません。しか〜しそれは甘い考えなのです。チンスコウのように甘いのです。
UVC規格でのH.264対応について
例えば自分も持っているLogicool C930eはH.264のハードウエア圧縮に対応しています。H.264を使えばMJPEGよりも更に数分の1のデータサイズで転送できます。なのでぜひとも使いたいところです。というかそのためにわざわざC930eを買ったのでした。
しかしど〜んなに頑張ってもH.264用のフォーマットディスクリプタもフレームディスクリプタも見つかりません(´・ω・`)
Logicoolの専用ドライバを入れたPCでしかアクセス出来ない悪いやつなのか、いえいえそんな事はありません。実はUVC規格でのH.264対応方法には2種類あるのです。
- YUY2やMJPEGと同様にフォーマットディスクリプタとフレームディスクリプタを使う方法
UVC1.5規格でのH.264対応 - MJPEGのペイロードに埋め込んで転送する方法
UVC1.1規格でのH.264対応
C930eの場合には2つ目のMJPEGのペイロードに埋め込んで転送する方法でのみH.264で圧縮された映像を取得できるのでした。しかもこの方法はかなり面倒なことをしないとH.264で圧縮された映像を取得できるようにならないのです(´・ω・`)
続く^^/