使用Camera.PreviewCallback实现时,初始化相机并开始预览(Camera.startPrevew())后,onPreviewFrame会被无故障地调用。问题是,如果我使用MediaRecorder onPreviewFrame进行视频录制,则不再调用。
据我所知,当使用MediaRecorder录制视频时会停止Camera.PreviewCallback,但为什么不能重启?
我已经尝试重置相机预览回调(setPreviewCallback(回调))并重新启动startPreview,但是当我有预览时,没有调用onPreviewFrame。
答案 0 :(得分:16)
您必须在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());
}
}
答案 1 :(得分:9)
我有类似的问题;见
setOneShotPreviewCallback not hitting onPreviewFrame() in callback
我发现在调用Camera#unlock()
准备MediaRecorder
后,必须在设置预览回调之前调用Camera#reconnect()
。这是因为Camera.unlock()
将相机从进程中分离出来,让MediaRecorder
连接到它。
http://developer.android.com/reference/android/hardware/Camera.html#unlock()
在我的调查中,我还发现如果使用除单击方法之外的其他方法设置任何预览回调,则必须在调用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
我希望有所帮助!
答案 2 :(得分:4)
你应该在previewCallBacks()接口的新实例化中调用它,如下面的
public void surfaceCreated(SurfaceHolder holder) {
// if (mediaRecorder == null) {
try {
camera = Camera.open();
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] _data, Camera _camera) {
}
}
}
}
答案 3 :(得分:0)
拍摄视频或照片后,您需要再次调用startPreview()。