質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

5545閲覧

Android Camera2におけるYUV_420_888フレームバッファの色差データが空となっている

kzkysdjpn

総合スコア8

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/13 16:23

編集2016/06/14 01:13

###前提・実現したいこと
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のフレームバッファは正常に取得できているのでしょうか。
動作確認できている方おりましたら、教えていただけますと助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問