Запись видео - невозможно запустить предварительный просмотр камеры - PullRequest
2 голосов
/ 11 октября 2011

Я работаю над пользовательским классом видеозаписи, и у меня возникают некоторые проблемы с отображением предварительного просмотра камеры при первом появлении действия.Я вызываю эту функцию внутри surfaceCreated обратного вызова:

private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if(camera == null) {
    camera = Camera.open();
    camera.unlock();
}

if(recorder == null)
    recorder = new MediaRecorder();

recorder.setPreviewDisplay(surface);
recorder.setCamera(camera);

camera.startPreview();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(15000000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);


try {
    recorder.prepare();
} catch (IllegalStateException e) {
    // This is thrown if the previous calls are not called with the 
    // proper order
    e.printStackTrace();
}
}

Когда запускается действие, мое приложение вылетает, говоря:

java.lang.RuntimeException: startPreview failed

Выше этой ошибкиЯ заметил строку, говорящую:

attempt to use a locked camera from a different process (old pid 4894, new pid 6405)

Когда я перехожу через код, эта ошибка возникает в строке camera.startPreview().Если я удалю эту строку из своего кода, предварительный просмотр будет хорошо выглядеть после того, как я позвоню recorder.start(), а до этого у меня просто черный экран с кнопкой записи.Как только я прекращаю запись, предварительный просмотр продолжает отображаться нормально (я звоню camera.startPreview() после того, как я прекращаю запись).

Поскольку я звоню camera.unlock() только за несколько строк до начала предварительного просмотра, идва вызова происходят в одной и той же функции, как я могу иметь эту ошибку?

Редактировать : Я тестировал один и тот же код без вызова startPreview() на Droid X2 и Droid 1, и он отлично работает.Похоже, что EVO 4G является проблемой.Я буду продолжать расследование.

Ответы [ 3 ]

0 голосов
/ 04 августа 2015

Я ответил на очень похожий вопрос: Предварительный просмотр в Android Media Recorder

Посмотрите, поможет ли вам это, у него есть целое действие, которое работает с предварительным просмотром и записывает видео.

0 голосов
/ 22 декабря 2018

camera.unlock() должен вызываться из того же потока, в котором ранее была заблокирована камера.Проверьте свои журналы на наличие сообщений типа Unlock call from pid 19322; currently locked to pid 17652.

. Обратите внимание, что блокировку можно установить, позвонив по номеру Camera.lock() или MediaRecorder.start()

Начиная с уровня API 14 камера автоматически блокируетсяприложения в MediaRecorder.start ().Приложения могут использовать камеру (например, увеличение) после начала записи.Нет необходимости вызывать это после начала или остановки записи.

0 голосов
/ 27 июня 2013

Создайте такой код и уменьшите скорость кодирования видео.Это очень высокий размер вашего видео.Это может не создавать проблемы на вашем устройстве, потому что на некоторых устройствах оно обрезается внутри.

private void initRecorder(Surface surface) throws IOException {
    // It is very important to unlock the camera before doing setCamera
    // or it will results in a black preview
    if (camera == null) {
        camera = Camera.open();
        camera.unlock();
    }

    if (recorder == null)
        recorder = new MediaRecorder();

    recorder.setCamera(camera);

    camera.startPreview();

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    recorder.setVideoEncodingBitRate(2048000);
    recorder.setMaxDuration(10000); // length of video in MS
    recorder.setVideoSize(720, 480);
    recorder.setVideoFrameRate(30);
    recorder.setOutputFile("/sdcard/test.mp4");
    recorder.setPreviewDisplay(surface);
    try {
        recorder.prepare();
    } catch (IllegalStateException e) {
        // This is thrown if the previous calls are not called with the
        // proper order
        e.printStackTrace();
    }
}
...