• スポンサードリンク

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

Android Camera NDK USB

JNI関連・・・nativer側

serenegiant_usb_UVCCamera.cpp

まずは、serenegiant_usb_UVCCamera.cppに1つだけ関数を追加します。わざわざ載せるまでも無いコードですけど。

プレビュー用のSurfaceを引き渡すときと同様に、ANativeWindow_fromSurfaceを呼び出してJavaのSurfaceからANativeWindowへのポインタを取得してそれをセットします。
後はJNINativeMethod methods[]配列にnativeSetCaptureDisplayを追加してあげるだけです。
JNIEnv#RegisterNativesを使っているので、関数を追加するのも楽ちんです。
UVCCamera.cppにも1つ関数を追加していますが、単なる中継関数でつまらなさすぎるので、UVCCamera.cppのコードは省略することにします。

UVCPreview.cpp

お次はUVCPreview.cppです。つまらなかったJNI周辺と違ってこっちは盛り沢山です。
元々のプレビュー表示処理のおおよその流れはこんな感じでした。

  1. setPreviewDisplayを呼び出して、プレビュー表示に使うためのSurfaceをセットする
  2. startPreviewを呼び出して、プレビューを開始。実際にはプレビュー処理用のスレッドを生成・実行する
  3. プレビュー表示処理を行う(カメラからフレームデータが届くたびに描画が行われる)
  4. プレビュー処理が終わったら、stopPreviewを呼び出してプレビュー処理用スレッドへ終了要求してから終了待ちをする。

これをこんな感じに変えます。

  1. setPreviewDisplayを呼び出して、プレビュー表示に使うためのSurfaceをセットする
  2. startPreviewを呼び出して、プレビューを開始。実際にはプレビュー処理用のスレッドを生成・実行する。
    同時に、キャプチャ処理用のスレッドも生成・実行して、キャプチャ用Surfaceがセットされるまで待機する
  3. カメラからフレームデータが到着するたびにプレビュー表示処理を行い、最新のフレームデータ(変換済み)をキャプチャ用に保持しておく
  4. キャプチャ用Surfaceがセットされていれば、最新のフレームデータ(変換済み)をキャプチャ用Surfaceに書き込む
  5. キャプチャが必要なくなればキャプチャ用Surfaceをクリアする
  6. プレビュー処理が終わったら、stopPreviewを呼び出してプレビュー処理用スレッドへ終了要求してから終了待ちをする。

ところで、キャプチャするにはカメラからのフレームデータを取得できる状態で無ければなりません。本来は別にプレビュー表示している必要は無いのですが、今のライブラリの仕様ではプレビュー表示しないことにはフレームデータを取得できません。なので、プレビュー表示中だけキャプチャ出来るようにしています。

いよいよコードです。以前の記事では確か力尽きて、GitHubのコード見てね〜ってしてしまったので、今回は・・・載せましょう(^o^)/でも長いので覚悟してください。と言うか長くてスルーされるかも(;_;)

長すぎてあんまりなので、一旦ちょん切りました。まだまだ続きますよぉ〜

« »

  • スポンサードリンク

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