setOneShotPreviewCallback не выполняет onPreviewFrame () в обратном вызове

1

Я создаю активность захвата видео для приложения, которое я создаю, и я хочу захватить рамку предварительного просмотра, а также использовать в качестве кнопки воспроизведения. Я установил SurfaceView вверх в onCreate(...) и подключил дисплей предварительного просмотра камеры в SurfaceHolder.Callback:

private Callback mSurfaceViewCallback = new Callback() {

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mSurfaceCreated = false;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mSurfaceCreated = true;
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        try {
            mSurfaceCreated = true;
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
};

который отлично работал для приложения статической камеры. Предварительный просмотр камеры включается и выключается в onPause() и onResume():

@Override
protected void onResume() {
    super.onResume();
    if(mCamera!=null)
        mCamera.startPreview();
}

@Override
protected void onPause() {
    if(mCamera!=null)
        mCamera.stopPreview();
    super.onPause();
}

и я установил MediaRecorder следующим образом:

protected void startRecording() {
    mMediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));

    mMediaRecorder.setMaxDuration(10000);
    mMediaRecorder.setOutputFile(new File(getFilesDir(), mChallengeUUID + ".mp4").getAbsolutePath());
    mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera.setOneShotPreviewCallback(mPreviewCallback);
    mMediaRecorder.start();
}

Однако предпоследняя линия не работает. Мой метод Camera.PreviewCallback onPreviewFrame(...) пропущен.

Цель иметь, как я сказал, получить кадр с начала, когда видео записывается для отображения пользователю. Почему не срабатывает обратный вызов?

Теги:
callback
android-camera
preview
android-mediarecorder

1 ответ

1
Лучший ответ

mCamera.unlock() отсоединяет камеру от процесса. Необходимо позвонить:

mCamera.reconnect();

перед вызовом:

mCamera.setOneShotPreviewCallback(mPreviewCallback);

(но после всего остального).

  • 0
    Это не работает для меня. Если я вызываю mCamera.reconnect до mMediaManager.start, то запуск завершается неудачно. Если я вызываю его после запуска, setOneShotPreviewCallback игнорируется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню