• スポンサードリンク

UVCCameraプロジェクトを更新したよ

Android Camera USB

GitHubで公開中のUVCCameraプロジェクトを更新したよ\(^o^)/

フレームデータをbyte配列とかで取得したいって問い合わせがよく来るので専用メソッドを追加しました。

・・・本当はWebRTCのデモアプリで使うからなんだけど(^_^)v もう少しで動きそうなんだよ〜と言うかUVCカメラとの接続機能自体は組み込めてるんだけど、まだ画面に表示できない(´・ω・`) WebRTCはソースが十何GBある時点ですでにまっとうなプログラムじゃないと思うけど中の構造がもっといかれてるんだよぉ変なんだよぉ(T_T) スパゲッティーを通り越して金たわしみたいな感じ(解きほぐすのは絶望的、みたいな!?)

それはさておき、追加したのはIFrameCallbackインターフェースと、

です。

IFrameCallbackは#onFrame(ByteBuffer frame)というメソッドを持つコールバック用のインターフェースです。IFrameCallbackインターフェースを実装したオブジェクトをUVCCamera#setFrameCallbackでセットすると、毎フレームコールバックが呼び出されます。ちなみにプレビュー中でもプレビュー停止中でもセット可能です。
IFrameCallbackとしてnullを渡すとコールバックが解除されます。

pixelFormatに指定可能なのは次の4つ

  • UVCCamera#PIXEL_FORMAT_YUV
  • UVCCamera#PIXEL_FORMAT_RGB565
  • UVCCamera#PIXEL_FORMAT_RGBX
  • UVCCamera#PIXEL_FORMAT_NV21

それぞれ、YUV/RGB565/RGBX/NV21に対応します。って見たまんまや(^_^;)

YUVはYUVのインターレース形式、NV21はYUV420SemiPlanarで内蔵カメラのデフォルトのピクセルフォーマットと同じだからね。他にPIXEL_FORMAT_RAWという定数も定義してありますが、実際にはPIXEL_FORMAT_YUVと同じです。この中では、YUVが一番早く処理できます(内部フォーマットがYUVなので追加変換無しにコールバックへ渡せるので)。

ただせっかく作っといてなんですが、YUV/RAW以外はCPUでピクセルフォーマット変換するのであんまり早くないです(´・ω・`) 可能な限りSurfaceやSurfaceTextureを使って、OpenGL|ESのテクスチャとして操作するのがいいです(USBCameraText3のUVCCameraTextureView内にサンプルがあります)。RGB565やRGBXとして取得するのであれば今回追加したコールバックを使わずにSurfaceTextureを使ってテクスチャに書き込んでOpenGL|ESでオフスクリーン描画&glReadPixelsする方が早いと思います(測定・比較はしてないけど)

使い方のデモ用にIFrameCallbackを使ってフレームデータを受け取って処理するサンプルも追加しました。UsbCameraText5です(^o^)/
他のサンプルは全てMediaCodec#createInputSurfaceを使ってSurfaceを取得してそこへ書き込むことでMediaCodecへフレームデータを入力して録画しますが、UsbCameraText5だけはByteBufferを使ってMediaCodecへ流し込みます。

あっそうだもう一つ書いとかなきゃ。上で書いたフレームコールバックは、startCaptureでセットしたSurfaceへの書き込みと同じスレッド上で動きます。なので、#startCaptureと#setFrameCallbackの同時使用はお勧めしません。どっちも遅くなってしまいます。

これぐらいかな?
お疲れ様でした。

« »

  • スポンサードリンク

コメント