スポンサーリンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« WebcamRecorderの開発を開始 | トップページ | 「羽生バイト」とか »

多分、MJPEGにも対応

今は、Ubuntu向けのWebカメラレコーダーを開発中なのだが、昨日書いたように、今時のWebカメラは「USB Video Class」、つまり、UVC対応なので、UbuntuでもOSが提供する共通ドライバで利用可能だ。しかし、Ubuntuが提供しているインタフェースは低レベルなので・・・

低レベル、と、書くと、普通の人なら悪口の様に聞こえるかもしれないのだが、コンピュータ業界では、別段、悪口という事にはならない。

何故なら、例えば、ハードウェアエンジニア出身でプログラム開発をしたりしている人の場合、その反対語になる高レベルというモノの方が、トラブルを発生させやすいので、コーディングは、極力、低レベルなインタフェースで行いたいと思ったりもするからだ。

で、作者はハードウェアエンジニア出身な訳なので、高レベルインタフェースよりは、低レベルのインタフェースの方が使いやすかったりする事も多いのだが、UbuntuでWebカメラを扱う時に使用する事になるインタフェースというのは、V4L2という事になっているのだが、このインタフェースは、あまりにも低レベルすぎるので、扱いづらい訳だ。

具体的には、WindowsでWebカメラを扱う場合には、DirectShowなんかのインタフェースを使う事になるのだが、このインタフェースは、比較的、高レベルなので、データの取得にあたっては、好きなフォーマットが選択できる訳だ。

例えば、Webカメラがデータの出力形式としてYUV形式しかサポートしていなくても、DirectShow側で、そのデータをRGB形式に変換してくれたりもする訳だ。

もっとも、YUV→RGBへの変換は大して難しくもないので、作者的には、自らが作成した処理コードも色々と持っている。なので、インターフェースの出力形式がYUV形式しか無かったとしても、殆ど、問題にはならないのだが、Webカメラには、その出力形式としてMJPGを採用しているモノも多い訳だ。

当然の事ながら、Webカメラのハードウェア的には、オリジナルのデータ形式はYUVかRGB形式になっている筈なので、出力形式をMJPG形式にするためには、カメラの基本ハードウェア以外にエンコード用のハードウェアも搭載しなければならない。

で、Webカメラのデータを扱うソフトも、そのデータはYUVかRGB形式として扱うので、MJPG形式で送られてくるデータはPC側でYUVかRGB形式にデコードしなければならない。

と、言うことなので、上記を見ていると、データをMJPG形式に変換するのは馬鹿げた行為の様に思えるかもしれないのだが、実際、Windows10も、2016年の大規模アップデート時には、サポートするWebカメラのデータ形式はYUV形式のみにして、従来はサポートしていたMJPGやH264なんかの形式はサポート対象外にしようとした訳だ。

しかし、結局は、世間からの非難を受けて、MJPG/H264のサポートは継続される事になったのだが、上記の様に、Webカメラのデータ形式をMJPGやH264にすると、Webカメラ側にはエンコードHWが必要になるし、PC側ではそれらをデコードするために処理負荷が高くなってしまう。

にもかかわらず、こんな形式が使われているのは、例えば、1920x1080の解像度で60FPSのデータを転送しようとすると、データ形式がRGB24だった場合には、1920x1080x3x60x8=2,985,984,000bps、つまり、約3Gbpsもの転送速度が必要になるからだ。

つまり、USB2.0の転送速度は理論値で480Mbpsしかないので、例えば、640x480のYV12映像を30FPSで転送する場合には、640 x 480 x 1.5  x 30 x 8 = 110,592,000、なので、100Mbp程度の実効転送レートがあるUSB2.0でも転送可能なのだが、前述の様に、フルHDクラスの解像度になると、転送速度が10倍は足りない訳だ。

なので、Webカメラの出力形式としては、データサイズを10倍以上に圧縮できるMJPGやH.264が使われている訳なのだが、USB3.0なら、転送速度は理論値で5Gbpsあるので、非圧縮形式でも、普通にスカイプする程度の解像度とフレームレートなら、出ない事もない。

と、言うことで、WebカメラがMJPG/H.264なんかの圧縮形式でデータを出力してくるのは、USBの転送速度の問題になるので、USB3.0が普及してきた現在、非圧縮形式のみのサポートにしても良いんじゃないか? と、マイクロソフト的には思ったのかもしれないのだが、作者の手持ちのWebカメラはUSB2.0にしか対応していないので、MJPG形式で転送させてやらないと、HD画質で30FPSは出ない。

なので、やはり、MJPGのサポートを何の事前通達もなくやめてしまおうとしたWindows10でのやり方は暴挙だったかもしれないのだが、本題に戻ると、Ubuntuで使用できるWebカメラ用のインタフェースである所のV4L2では、MJPGデータをRGBデータに変換したりはしてくれない訳だ。

このため、MJPGデータを出力してくるWebカメラをサポートしようとすると、アプリケーションで、MJPGデータをRGBデータ等に変換してやらなければならなくなるので、大変になるのだが、今日の時点で、何とか、変換の目処は立ったので、開発中のUbuntu版Webカメラレコーダーでも、WebカメラからのMJPGデータ出力には対応する事になる筈だ。

もっとも、H.264については、サポートしているWebカメラは殆どないし、デコードはMJPGの何倍も大変になるので、サポートしない事にする。

 

« WebcamRecorderの開発を開始 | トップページ | 「羽生バイト」とか »

2019年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google