I am working on a camera application, you need to extract some data from the preview of each frame, so I tried to do this using onPreviewFrame, the problem is that with my onPreviewFrame code it is called only once and during debugging I do not get errors, therefore I do not know what to do
here is my code
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "CameraPreview";
private SurfaceHolder mHolder;
private Camera mCamera;
public byte[] buffer;
public CameraPreview(Context context, Camera camera) {
super(context);
Log.d("Function", "CameraPreview constructor iniciado");
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d("Function", "SurfaceCreated iniciado");
try {
mCamera.setPreviewDisplay(holder);
buffer = previewBuffer();
mCamera.addCallbackBuffer(buffer);
mCamera.setPreviewCallbackWithBuffer(previewCallback);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("Function", "SurfaceDestroyed iniciado");
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.d("Function", "surfaceChanged iniciado");
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
}
try {
mCamera.setPreviewDisplay(mHolder);
buffer = previewBuffer();
mCamera.addCallbackBuffer(buffer);
mCamera.setPreviewCallbackWithBuffer(previewCallback);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
PreviewCallback previewCallback = new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
Log.d("Function", "onPreviewFrame iniciado");
Size previewSize = camera.getParameters().getPreviewSize();
Log.d("Function", "onPreviewFrame: preview size=" + previewSize.height + " " + previewSize.width);
YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);
byte jpgData[] = baos.toByteArray();
}
};
private byte[] previewBuffer() {
Log.d("Function", "previewBuffer iniciado");
int bufferSize;
byte buffer[];
int bitsPerPixel;
Camera.Parameters mParams = mCamera.getParameters();
Camera.Size mSize = mParams.getPreviewSize();
Log.d("Function", "previewBuffer: preview size=" + mSize.height + " " + mSize.width);
int mImageFormat = mParams.getPreviewFormat();
if (mImageFormat == ImageFormat.YV12) {
int yStride = (int) Math.ceil(mSize.width / 16.0) * 16;
int uvStride = (int) Math.ceil((yStride / 2) / 16.0) * 16;
int ySize = yStride * mSize.height;
int uvSize = uvStride * mSize.height / 2;
bufferSize = ySize + uvSize * 2;
buffer = new byte[bufferSize];
Log.d("Function", "previewBuffer: buffer size=" + Integer.toString(bufferSize));
return buffer;
}
bitsPerPixel = ImageFormat.getBitsPerPixel(mImageFormat);
bufferSize = (int) (mSize.height * mSize.width * ((bitsPerPixel / (float) 8)));
buffer = new byte[bufferSize];
Log.d("Function", "previewBuffer: buffer size=" + Integer.toString(bufferSize));
return buffer;
}
}
source
share