• スポンサードリンク

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

Android Camera NDK USB

USB Webカメラからの動画キャプチャの2回目です。
今回はJava/nativeのそれぞれのJNI関連部分とnativeコードをメインにしたいと思います。

JNI関連・・・Java側

UVCカメラとのアクセス用のクラスUVCCameraに少しだけメソッドを追加します。
何がしたいかと言うと、前回の記事に載せたSurfaceEncoderから取得したSurfaceへ、native側からカメラのフレームデータを書き込みたいのです。そのためにはnative側へSurfaceを引き渡せるようにする必要があります。
と言う事で早速コードです。

これ以外は今までのUVCCamera.javaと変わりません。
既に似たようなメソッドがUVCCameraには既に有りましたよね。これです。名前が違うだけですることは大して変わりません。

こっちは、ヘルパーメソッドが3種も有りますが、キャプチャ用のSurfaceをセットする方はSurface以外が引数に来る可能性は無いので、ヘルパーメソッドも1つだけです。
あっそうそう、毎度のことながら異常系の処理はかなり省略しているので必要に応じて実装してください。

次はnative側・・・と言いたいところですがその前に、解説はしませんがMainActivityでの処理をまるっと載せておきましょう。

MainActivity

キャプチャ関連以外で違うのは主に、SurfaceTextureListenerを実装したぐらいであとは以前のと殆ど一緒です。180行目辺り以降が主にキャプチャ処理になります。

解説しないと言っときながらあれですけど、1つだけ大事なことを忘れてました。112-119行目です。
以前のサンプルではこの部分を

としていましたので、プレビューを一旦停止してからしてからもう一度プレビューを行おうとしても表示できませんでした。(一旦アプリを終了させれば出来ます)
native側でANativeWindow_releaseを呼び出して参照を開放すればSurfaceも開放されるみたいなことを何処かで読んだように思ったんですけど、Java側で明示的に開放しないとうまく行きませんでした。

次こそは本当にnative側です。と言っても、さっきのUVCCamera.javaに一個しかネイティブメソッドを追加してないことからわかるようにJNI周りは超しょぼいです。

« »

  • スポンサードリンク