###前提・実現したいこと
AndroidのCamera2を使用してYUV_420_888
フレームバッファを取得しようとしています。
###発生している問題・エラーメッセージ
Camera2でのYUVフレームバッファを取得するには、
ImageReaderを使用すると思いますが、
実際に取得したデータには、
輝度情報のみとなっており、色差データが空になっているようです。
ImageReaderを使用してコールバックで取得したImageオブジェクトを以下の用に
保存しています。
public void onFrameBufferStore(Image arg) { FileOutputStream out; WritableByteChannel channel; String fileName; fileName = Environment.getExternalStorageDirectory() + "/Pictures/" + "image_" + (arg.getTimestamp() / 1000) + ".dump"; try { out = new FileOutputStream(new File(fileName)); channel = out.getChannel(); /* 輝度データの書き込み -> データは入っている */ channel.write(arg.getPlanes()[0].getBuffer()); /* 色差データの書き込み -> データは空、書き込みはサイズともに正常 */ channel.write(arg.getPlanes()[1].getBuffer()); /* 色差データの書き込み -> データは空、書き込みはサイズともに正常 */ channel.write(arg.getPlanes()[2].getBuffer()); out.flush(); channel.close(); } catch (IOException e) { e.printStackTrace(); } return; }
###該当のソースコード
private boolean setupVideoCaptureCallback(Size captureSize) { HandlerThread thread; Handler backgroundHandler; mImageReader = ImageReader.newInstance( captureSize.getWidth(), captureSize.getHeight(), ImageFormat.YUV_420_888, mMaxQueuingFrame); mReaderListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image; try { image = reader.acquireLatestImage(); }catch(IllegalStateException e){ e.printStackTrace(); return; } if(image == null) { return; } onFrameBufferStore(image); }; thread = new HandlerThread("VideoCaptureCallback"); thread.start(); backgroundHandler = new Handler(thread.getLooper()); mImageReader.setOnImageAvailableListener(mReaderListener, backgroundHandler); return true; } protected void createCameraPreviewSession() throws CameraAccessException { SurfaceTexture texture; Surface surface; int i; texture = mTextureView.getSurfaceTexture(); if(texture == null){ return; } texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); surface = new Surface(texture); mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); if(mImageReader != null){ mSurfaces.add(mImageReader.getSurface()); } mSurfaces.add(surface); for(i = 0; i < mSurfaces.size(); i++){ mPreviewBuilder.addTarget((Surface)mSurfaces.get(i)); } mCameraDevice.createCaptureSession(mSurfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mPreviewSession = session; try { updatePreview(); } catch (CameraAccessException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return; } @Override public void onConfigureFailed(CameraCaptureSession session) { return; } }, null); return; }
###試したこと
フレームバッファをダンプし、ビューワソフトで確認したところ、
輝度データは入っているものの、色差データについては、入っていないようで、
緑色の画像が表示されます。
またMediaCodecでエンコードされたデータについても、
ダンプしたものと同じ映像が表示されております。
###補足情報(言語/FW/ツール等のバージョンなど)
テスト機器は
NEC LAVIE Tab PC-TE508BAW
で行っています。予算的に他の端末機器でのテストができていないのですが、
他の端末などでは、YUVのフレームバッファは正常に取得できているのでしょうか。
動作確認できている方おりましたら、教えていただけますと助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。