AndroidカメラプレビューコールバックインターフェイスPreviewCallbackの使用



Android Camera Preview Callback Interface Previewcallback Use



まず、Camera.PreviewCallbackインターフェイスを実装するクラスを定義してから、パラメーターデータであるonPreviewFrame(byte [] data、Camera camera)メソッドで各フレームのプレビューデータを受信します。

次に、setPreviewCallback()、setOneShotPreviewCallback、またはsetPreviewCallbackWithBuffer()を使用して、コールバックインターフェイスを登録します。これを行ういくつかの方法があります:
1、void setPreviewCallback(Camera.PreviewCallback cb)
このメソッドを使用してプレビューコールバックインターフェイスを登録すると、カメラプレビューが破棄されるまで、onPreviewFrame()メソッドが呼び出されます。

onPreviewFrame()メソッドはCamera.open()と同じスレッドで実行されるため、onPreviewFrame()がUIスレッドをブロックしないようにするには、Camera.open()を子スレッドに配置します。



2、void setOneShotPreviewCallback(Camera.PreviewCallback cb)
このメソッドを使用してプレビューコールバックインターフェイスを登録すると、次のフレームデータがonPreviewFrame()メソッドにコールバックされます。呼び出しが完了すると、コールバックインターフェイスは破棄されます。つまり、プレビューフレームデータのみが1回呼び出されます。
3、void setPreviewCallbackWithBuffer(Camera.PreviewCallback cb)
setPreviewCallbackと同じように機能しますが、フレームデータをプレビューするためのバッファとしてバイト配列を使用する必要があります。これにより、フレームデータのプレビューに使用されるメモリをより適切に管理できます。通常、addCallbackBufferメソッドで使用されます。擬似コードは次のとおりです。

Byte[] mPreBuffer = new byte[size]//First allocate a block of memory as a buffer, size is calculated in the fourth point mCamera.addCallbackBuffer(mPreBuffer) mCamera.setPreviewCallbackWithBuffer(Camera.PreviewCallback cb) mCamera.startPreview() @Override public void onPreviewFrame(byte[] data, Camera camera) { if (mPreBuffer == null) { mPreBuffer = new byte[size] } mCamera.addCallbackBuffer(mPreBuffer)//Add this buffer to the preview callback buffer queue

setPreviewCallbackWithBufferはstartPreview()の前に呼び出す必要があります。これは、setPreviewCallbackWithBufferがフレームデータをプレビューするためのバッファーとしてバイト配列を指定する必要があるため、setPreviewCallbackWithBufferの前にaddCallbackBufferを呼び出して、onPreviewFrameのデータに値を持たせる必要があるためです。



要約すると、addCallbackBufferを設定する場所は2つあり、1つはstartPreviewの前にあり、もう1つはonPreviewFrameにあります。それらの両方を呼び出す必要があります。 onPreviewFrameで呼び出されない場合、プレビューフレームデータはonPreviewFrameにコールバックされません。

4、void addCallbackBuffer(byte [] callbackBuffer)
事前に割り当てられたバッファをプレビューコールバックバッファキューに追加します。アプリケーションは、このキューに1つ以上のバッファーを追加できます。プレビューフレームデータが到着し、バッファキューにまだ少なくとも1つの使用可能なバッファがある場合、バッファは消費されてキューから削除され、バッファはプレビューコールバックインターフェイスを呼び出します。プレビューフレームデータが到着したときにバッファが残っていない場合、フレームデータは破棄されます。バッファ内のデータが処理されると、アプリケーションはこのバッファをバッファキューに追加し直す必要があります。
YV12以外の形式の場合、バッファのサイズは、プレビュー画像の幅と高さ、およびピクセルあたりのバイト数の積です。幅と高さは、getPreviewSize()メソッドを使用して取得できます。ピクセルあたりのバイト数は、ImageFormat.getBitsPerPixel(mCameraParameters.getPreviewFormat())/ 8を使用して取得できます。
YU12形式の場合、バッファのサイズは、公式ドキュメントで詳しく説明されているように、setPreviewFormat(int)の式を使用して計算できます。
このメソッドは、setPreviewCallbackWithBuffer(PreviewCallback)を使用する場合にのみ必要です。 setPreviewCallback(PreviewCallback)またはsetOneShotPreviewCallback(PreviewCallback)を使用すると、バッファーが自動的に割り当てられます。提供されたバッファが小さすぎてプレビューフレームデータをサポートできない場合、プレビューコールバックインターフェイスはnullを返し、バッファキューからバッファを削除します。