使用Camera.PreviewCallback实现时,在初始化相机并启动预览(Camera.startPrevew())之后,调用onPreviewFrame没有问题。问题是,如果我使用MediaRecorder进行视频录制,则不会再调用onPreviewFrame。
我知道使用MediaRecorder录制视频会导致Camera.PreviewCallback停止,但是为什么不能重启呢?
我尝试了重置摄像头预览回调(setPreviewCallback( callback ))并重新启动startPreview,但当我有预览时,没有调用onPreviewFrame。
发布于 2013-03-12 18:17:15
您必须在surfaceChanged方法中调用setPreviewCallback,而不仅仅是在surfaceCreated中。
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null){
return;
}
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
}
try {
mCamera.setPreviewCallback(this);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
发布于 2013-05-16 04:24:26
我也遇到过类似的问题,请参阅
setOneShotPreviewCallback not hitting onPreviewFrame() in callback
我发现在调用Camera#unlock()
准备MediaRecorder
之后,在设置预览回调之前需要调用Camera#reconnect()
。这是因为Camera.unlock()
会将摄像头从进程中分离出来,以便让MediaRecorder
连接到摄像头。
http://developer.android.com/reference/android/hardware/Camera.html#unlock()
在我的调查中,我还发现,如果您使用one shot方法以外的其他方法设置任何预览回调,则必须在调用Camera#reconnect()
之后重置所有这些回调。所以,简单地说:
mCamera.unlock();
//set up MediaRecorder
mCamera.reconnect();
mCamera.setPreviewCallback(mCallback);
//or whatever callback method you want to use
//and even if you've set this callback already
我希望这对你有帮助!
发布于 2011-09-14 12:27:14
您应该在previewCallBacks()接口的新实例化中调用它,如下所示
public void surfaceCreated(SurfaceHolder holder) {
// if (mediaRecorder == null) {
try {
camera = Camera.open();
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] _data, Camera _camera) {
}
}
}
}
https://stackoverflow.com/questions/7042377
复制相似问题