Я работаю над пользовательским классом видеозаписи, и у меня возникают некоторые проблемы с отображением предварительного просмотра камеры при первом появлении действия.Я вызываю эту функцию внутри 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 является проблемой.Я буду продолжать расследование.