我正在开发一个图像识别应用程序,希望相机一直自动对焦。 ZXing的人们通过每隔几秒钟调用一次autofocus()来解决此问题,但是在某些相机上,这种对焦不流畅,只能拉到一端并重新对焦。在我的阿尔卡特995(姜饼2.3.3 API等级10)手机上,每次发生这种情况时,它实际上都会发出令人震惊的点击。
此电话不支持FOCUS_MODE_CONTINUOUS_PICTURE。我尝试使用FOCUS_MODE_CONTINUOUS_VIDEO,该功能受支持,但无效。我编写了一个测试应用程序,该应用程序通常通过回调捕获相机的每个预览帧,但没有聚焦。我向该应用程序添加了录像机功能,并且在录制视频时,相机始终会自动对焦。但我认为,视频录制剥夺了在每一帧上进行回调的能力。已经讨论过
https://stackoverflow.com/questions/9477042/extract-video-frames-while-recording-the-video-on-android?rq=1
和
How to show real time filtered camera preview while recording videos?
这是一些测试代码:
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setDisplayOrientation(90); // just get it right for testing
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
Log.d(TAG, String.format("Frame %d", mFrameNumber++)); // see the frames in the logcat
}
});
} catch (IOException exception) {
mCamera.release();
mCamera = null;
Log.d(TAG, "exception setting parameters");
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
List<Size> previewSizes = parameters.getSupportedPreviewSizes();
Size previewSize = getOptimalPreviewSize(previewSizes, w, h);
parameters.setPreviewSize(previewSize.width, previewSize.height);
parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
mCamera.setParameters(parameters);
mCamera.startPreview();
if (mRecordingVideo)
startVideo(mCamera, holder);
}
// derived from http://developer.android.com/guide/topics/media/camera.html#capture-video
private void startVideo(Camera camera, SurfaceHolder holder) {
camera.stopPreview(); // not specified in documentation but seems to be needed
camera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // No audio is recorded
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mMediaRecorder.setOutputFile("/dev/null");
try {
mMediaRecorder.setPreviewDisplay(holder.getSurface());
mMediaRecorder.prepare();
} catch (IOException e) {
camera.release();
Log.d(TAG, "startVideo: Failed.");
e.printStackTrace();
}
mMediaRecorder.start();
}
如果在上面的代码中设置
mRecordingVideo
来启动录像机,我将获得自动对焦,但会丢失每个预览帧的回调。Camera.Parameters类定义说FOCUS_MODE_CONTINUOUS_VIDEO是“打算用于视频录制”的,但并不能明确表明它不能正常工作。
我还能说服连续自动对焦在姜饼手机中工作而不录制视频吗?我错过了什么吗?
这是手机专用的吗?其他手机是否在此模式下连续自动对焦而不录制视频?如果有人想在手机上试用该软件,我会将完整的测试应用程序的源发布到Github。
最佳答案
尝试将“ setRecordingHint(true)”设置为相机参数