Камера на предпросмотре кадра не вызывается - PullRequest
24 голосов
/ 12 августа 2011

при использовании реализации Camera.PreviewCallback onPreviewFrame вызывается без проблем после инициализации камеры и запуска предварительного просмотра (Camera.startPrevew ()). Проблема в том, что если я делаю видеозапись с помощью MediaRecorder, onPreviewFrame больше не вызывается.

Я понимаю, что при использовании MediaRecorder для записи видео останавливается Camera.PreviewCallback, но почему его нельзя перезапустить?

Я попытался сбросить обратный вызов предварительного просмотра камеры (setPreviewCallback (обратный вызов)) и перезапустить startPreview, но пока у меня есть предварительный просмотр, нет вызова onPreviewFrame.

Ответы [ 4 ]

16 голосов
/ 12 марта 2013

Вы должны вызывать 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());
}
}
10 голосов
/ 16 мая 2013

У меня была похожая проблема;см.

setOneShotPreviewCallback, не вызывающий onPreviewFrame () в обратном вызове

Я обнаружил, что после вызова Camera#unlock() для подготовки MediaRecorder необходимо было вызвать1009 * перед установкой обратного вызова предварительного просмотра.Это потому, что 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

Надеюсь, это поможет!

4 голосов
/ 14 сентября 2011

Вы должны вызывать его в новом экземпляре интерфейса previewCallBacks (), как показано ниже

public void surfaceCreated(SurfaceHolder holder) {
        // if (mediaRecorder == null) {
        try {
            camera = Camera.open();
            camera.setPreviewCallback(new PreviewCallback() {
                public void onPreviewFrame(byte[] _data, Camera _camera) {
                }
            }
        }
}
0 голосов
/ 28 февраля 2012

Вам нужно снова вызвать startPreview () после того, как было снято видео или фотография.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...