Камера onPreviewFrame не называется
при использовании реализации Camera.PreviewCallback onPreviewFrame вызывается без проблем после инициализации камеры и предварительного просмотра (Camera.startPrevew()). Проблема в том, что если я делаю видеозапись с использованием MediaRecorder onPreviewFrame, больше не вызывается.
Я понимаю, что при использовании MediaRecorder для записи видео останавливается Camera.PreviewCallback, но почему его нельзя перезапустить?
Я попытался сбросить обратный вызов предварительного просмотра камеры (setPreviewCallback (callback)) и перезапустить startPreview, но пока у меня есть предварительный просмотр, нет вызова onPreviewFrame.
Ответы
Ответ 1
Вы должны вызвать setPreviewCallback в методе surfaceChanged, а не только в 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());
}
}
Ответ 2
У меня была аналогичная проблема; см
setOneShotPreviewCallback не попадает в onPreviewFrame() в обратном вызове
Я обнаружил, что после вызова Camera#unlock()
для подготовки MediaRecorder
необходимо было вызвать Camera#reconnect()
перед установкой обратного вызова предварительного просмотра. Это связано с тем, что Camera.unlock()
отсоединяет камеру от процесса, чтобы MediaRecorder
подключался к ней.
http://developer.android.com/reference/android/hardware/Camera.html#unlock()
В моих исследованиях я также обнаружил, что если вы устанавливаете любые обратные вызовы предварительного просмотра, используя другие методы, кроме метода одного снимка, вы должны reset все это после вызова 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
Я надеюсь, что это поможет!
Ответ 3
Вы должны называть его в новом экземпляре интерфейса previewCallBacks(), например ниже
public void surfaceCreated(SurfaceHolder holder) {
// if (mediaRecorder == null) {
try {
camera = Camera.open();
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] _data, Camera _camera) {
}
}
}
}
Ответ 4
Вам нужно снова вызвать startPreview() после того, как было сделано видео или фото.