• スポンサードリンク

USB接続のWebカメラから動画をキャプチャした〜い(^o^)/〜その2

Android Camera NDK USB

まぁ全部載せることに意味があるかどうかと言われると・・・単に自分で、全部載せてやったぜぇ〜って喜ぶぐらいでしかないですけど。

キャプチャ関係(主に439行目以降)を追加したのと、以前のコードではYUYVからRGB565へ変換していたのをRGBXに変換してプレビュー表示するように変更しています。
というのも、MediaCodecのエンコーダーから取得できるSurfaceはRGBA8888しか受け付けてくれないらしいのです。
・・・自分で試した限りでは、ANativeWindow_lock/ANativeWindow_unlockAndPost(JavaでのSurface#lockCanvas/unlockCanvasAndPostに対応します)を使ってSurfaceへnative側から描画行う場合には、RGBA8888しか受け付けてくれませんでした。
例えばANativeWindow_setBuffersGeometryを呼び出して変更しようとすると、サイズやフォーマットが実際には変更されなくてもANativeWindow_lock/ANativeWindow_unlockAndPostで描画する際にエラーが出てうまく処理できません。もしかすると動く端末も有るかもしれませんが、よくわからないので、WINDOW_FORMAT_RGBA_8888に固定しておいて念の為にSurfaceのフォーマットの種類を確認することにしました(461-469行目)。
本来であれば、プレビュー用・キャプチャ用それぞれのSurfaceのフォーマットに応じてピクセルフォーマットの変換をするか、キャプチャ用に合わせてしまえばいいんでしょうね。でもサンプルではCPUでピクセルフォーマット変換をしているので、2回もピクセルフォーマット変換するとかなりCPU負荷が高くなってしまいます。特にHD解像度にすると、1フレーム当たり約92万画素=約3.6MBも処理しないといけないのでCPU負荷が高くなりすぎてプレビュー画面が乱れたりコマ落ちしやすくなります。サンプルではSD解像度に固定していますが、もしHD解像度で表示する場合には、GPUでのピクセルフォーマット変換を検討してください。

あと、フレームデータが壊れている時の検知を少しマシに変更(177〜180行目)したので、多少非力な端末でも画面が乱れにくくなっているはずです。

ってこれを読んでも、実際に試したことのない人にはチンプンカンプンなんだろうなぁ(-_-;)

続く…

のかな?大体はこれでおしまいなのですがもう少しだけ残っています。
でも長すぎるので今回はこれでおしまい。
お疲れ様でした。
そうそう、今回のソースをGitHubにアップロードします。こちら:UVCCamera

« »

  • スポンサードリンク

%d人のブロガーが「いいね」をつけました。