web-dev-qa-db-ja.com

Android Camera2 getPreviewFrame

カメラフレームをプレビューモードにしようとしています。 githubからサンプルプロジェクトを実行しています https://github.com/googlesamples/Android-Camera2Basic

私が抱えている問題は、フレームをプレビューモードにすることです。

コードは次のとおりです。

private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {

    private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {

                //HERE, HOW CAN I RETRIEVE THE CURRENT FRAME?

                break;
            }
            case STATE_WAITING_LOCK: {
               ...
                break;
            }
            case STATE_WAITING_PRECAPTURE: {
             ...
                break;
            }
            case STATE_WAITING_NON_PRECAPTURE: {
             ...
                break;
            }
        }
    }

フレームを取得しようとしたもう1つのことは、mImageReader.setOnImageAvailableListenerを設定することです。フレームのonImageAvailableコールバックを取得できると期待していましたが、onImageAvailableが呼び出されることはありません。 onPreviewFrameは私自身のメソッドであり、現在のフレームを渡す必要があります。

  mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2);
  mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);

  private final ImageReader.OnImageAvailableListener mOnImageAvailableListener  = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        mTextureView.onPreviewFrame(reader.acquireNextImage().getPlanes([0].getBuffer().array());
    }

};

私が間違っていることは何ですか?ありがとう。

14

CameraCaptureSession.setRepeatingRequest()メソッドに送信されたCaptureRequestImageReaderSurfaceをリストしなかったため、プレビューフレームが使用可能な場合、OnImageAvailableListener.onImageAvailableコールバックが呼び出されることはありません。出力ターゲット。

カメラにリクエストを送信するときに、各キャプチャのデータを送信する出力Surfaces(基本的には生のバイトバッファ)を特定します。したがって、「プレビューフレーム」を取得してonImageAvailable()コールバックをトリガーし、onPreviewFrame()メソッドに送信するには、次の行を追加するだけです。

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

この行は、同じリクエストビルダーにSurfaceTextureSurfaceを追加する他の同様の行の後に、e.g。を続けることができます。

これにより、すべてのプレビューフレームが関数に送信され、キャプチャボタンからの「出力フレーム」も送信されることに注意してください。 onImageAvailable()コールバックのコードで区別したい場合があります。

15
rcsumner