• スポンサードリンク

USBカメラから音&動画の同時キャプチャした〜い(その2)

Android Camera MediaCodec USB 非同期

まだまだ続くよぉ〜(^o^)/

src/com/serenegiant/glutils下にも同名のクラスがありますが、こっちのはUVCCameratextureViewのインナークラスです。内容的にも似たような処理をするので、glutils下のRenderHandlerを修正しようかとも思ったんですけどしっくり来なかったので結局インナークラスとして別に作ってしまいました。いつもの様にプライベートスレッドとメッセージキューを使ってシリアライズして実行依頼するためのHandlerの組み合わせになっています。

ちなみに、TextureViewから取得したSurfaceTextureへ直接カメラ映像を書き込んでもらうことも出来ますが(Surface/SurfaceTextureへの書き込み回数が1回減ります)、ここではカメラ側に映像を書き込んでもらうためのSurfaceTextureを描画用のプライベートスレッド内で新たに生成し、それを自前でTextureViewからのSurfaceTextureとMediaCodecへ書き込んでいます。
というのも、TextureViewから取得したSurfaceTextureをそのまま使った時に、実際の描画処理がどのスレッドで行われるか・・・実際の所UIスレッドで実行されちゃうんじゃないかと思ったからです(未確認、そもそもUSBCameraTest/USBCameraTest2ともTextureViewから取得したSurfaceTextureへ直接書き込んでいるのでこのアプリでは大きな問題にならないのは実証済みですが)。
なので、MediaStorePhotoAdapterの時にカメラ映像取得用のSurfaceTextureを生成したのとは若干意味合いが異なります。言っている意味判るかな?

後は特に今までの記事で出てきてない引っかかったところは無いと思うんだけど。しいてあげるなら、カメラ映像取得用のSurfaceTextureを生成・取得している部分かな?
SurfaceTextureを自前で生成するにはOpenGL|ESのテクスチャハンドルが必要になります。でもって、OpenGL|ESのテクスチャハンドルを生成するにレンダリングコンテキスト内で実行する必要があります。今回の場合であれば、描画用のプライベートスレッド内でeglMakeCurrentした状態で無ければなりません。でも、UVCCameraTextureView#getSurfaceTextureを呼び出すのはどのスレッドか判りません(実際はMainActivityでカメラとの接続イベントOnDeviceConnectListener#onConnectが呼び出された時に、スレッドプール内のスレッドで実行されます)。ということは、呼び出されたそのスレッド内ではSurfaceTextureを生成出来ません。「いっぺんしか言わんけどコンテキストが無いんじゃぁ〜」って警告メッセージがLogCatに残るだけでクラッシュはしなかったと思うけど、表示できなくなります。
なのでまず、
UVCCameraTextureView#getSurfaceTextureは次のようにしています。

ここは単にRenderHandler#getPreviewTextureを呼び出しているだけです。
呼び出されたRenderHandler#getPreviewTextureはと言うと、次にようにしています。

まずはじめにsynchronizedで排他制御してからsendEmptyMessageでSurfaceTexture生成依頼メッセージを送ります。その後#waitメソッドでSurfaceTextureが生成されるまで待機します。
メッセージはRenderHandler#handleMessageで処理されてRenderThread#updatePreviewSurfaceを呼び出します。この時点で#updatePreviewSurfaceは描画用のプライベートスレッド内で実行されることになりますので、自前のレンダリングコンテキストに切り替えてテクスチャハンドル・SurfaceTextureを生成します。完了すれば#notifyAllを呼び出して元のスレッドへ通知・待機解除します。

てな事は読んでもたぶんすんなりとはわかってもらえないだろうなぁ(-_-;)気になる方はソースをじっくり煮込んで下さい、じゃなかったじっくり眺めて処理を追っかけてみて下さい。デバッガで追っかけても大抵はわけわかんない結果になるだけだし、USBの通信も止まっちゃうからね。各ファイルのDEBUGフラグをtrueにしていればLogCatへいっぱいメッセージが出るので、それを追っかけて見るのもいいかも。

んでもって最後は静止画のキャプチャの残りです。

« »

  • スポンサードリンク

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