Android MediaRecorder – «start failed: -19»

Я пытаюсь создать видеомагнитофон на Android, и я подготовил свой код, который должен работать, но я постоянно получаю сообщение об ошибке start failed: -19 .

Вот мой код:

 public boolean startRecording() { try { camera.unlock(); mediaRecorder = new MediaRecorder(); mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() { @Override public void onError(MediaRecorder mr, int what, int extra) { Log.i(TAG, "Error"); } }); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); Log.i(TAG, "a"); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); Log.i(TAG, "b"); mediaRecorder.setMaxDuration(maxDurationInMs); // set to 20000 String uniqueOutFile = OUTPUT_FILE + System.currentTimeMillis() + ".3gp"; File outFile = new File(uniqueOutFile); if (outFile.exists()) { outFile.delete(); } mediaRecorder.setOutputFile(uniqueOutFile); mediaRecorder.setVideoFrameRate(videoFramesPerSecond); // set to 20 mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight()); Log.i(TAG, "c"); mediaRecorder.setPreviewDisplay(holder.getSurface()); mediaRecorder.setMaxFileSize(maxFileSizeInBytes); // set to 50000 mediaRecorder.prepare(); Log.i(TAG, "d"); mediaRecorder.start(); Log.i(TAG, "e"); return true; } catch (IllegalStateException e) { Log.i(TAG, "f"); Log.e(TAG, e.getMessage()); e.printStackTrace(); camera.lock(); return false; } catch (IOException e) { Log.i(TAG, "g"); Log.e(TAG, e.getMessage()); e.printStackTrace(); camera.lock(); return false; } catch (RuntimeException e) { Log.i(TAG, "h"); Log.e(TAG, e.getMessage()); camera.lock(); return false; } } 

Все журналы отладки (от «a» до «d») печатаются в журнале, поэтому кажется, что все шаги до mediaRecorder.prepare() выполнены правильно. Затем он получает RuntimeException с RuntimeException start failed: -19 сообщения start failed: -19 . Есть аналогичный вопрос , но это не решает мою проблему.

Есть ли другая причина для получения такой ошибки?

Просто узнал ошибку, в этой строке:

 mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight()); 

после комментирования этой строки, код работает отлично!

Я решил проблему, как только я добавил это для записи видео

 /** * Start video recording by cleaning the old camera preview */ private void startVideoRecorder() { // THIS IS NEEDED BECAUSE THE GLASS CURRENTLY THROWS AN ERROR OF // "MediaRecorder start failed: -19" // THIS WONT BE NEEDED INCASE OF PHONE AND TABLET // This causes crash in glass kitkat version so remove it // try { // mCamera.setPreviewDisplay(null); // } catch (java.io.IOException ioe) { // Log.d(TAG, // "IOException nullifying preview display: " // + ioe.getMessage()); // } // mCamera.stopPreview(); // mCamera.unlock(); recorder = new MediaRecorder(); // Let's initRecorder so we can record again initRecorder(); } /** * Initialize video recorder to record video */ private void initRecorder() { try { File dir = new File(folderPath); if (!dir.exists()) { dir.mkdirs(); } mCamera.stopPreview(); mCamera.unlock(); videofile = new File(dir, fileName + ".mp4"); recorder.setCamera(mCamera); // Step 2: Set sources recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) recorder.setProfile(CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH)); // Step 4: Set output file recorder.setOutputFile(videofile.getAbsolutePath()); // Step 5: Set the preview output recorder.setPreviewDisplay(mPreview.getHolder().getSurface()); // Step 6: Prepare configured MediaRecorder recorder.setMaxDuration(video_duration * 1000); recorder.setOnInfoListener(new OnInfoListener() { @Override public void onInfo(MediaRecorder mr, int what, int extra) { if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { mCamera.stopPreview(); releaseMediaRecorder(); /* * initiate media scan and put the new things into the * path array to make the scanner aware of the location * and the files you want to see */MediaScannerConnection.scanFile( CuxtomCamActivity.this, new String[] { videofile.getPath() }, null, null); Intent intent = new Intent(); intent.putExtra(CuxtomIntent.FILE_PATH, videofile.getPath()); intent.putExtra(CuxtomIntent.FILE_TYPE, FILE_TYPE.VIDEO); setResult(RESULT_OK, intent); finish(); } } }); recorder.prepare(); recorder.start(); } catch (Exception e) { Log.e("Error Stating CuXtom Camera", e.getMessage()); } } private void releaseMediaRecorder() { if (recorder != null) { recorder.reset(); // clear recorder configuration recorder.release(); // release the recorder object recorder = null; } } 

Подробное руководство см. В этом документе с открытым исходным кодом Cuxtom Cam

проблема в setVideoSize() .

и почему эта ошибка кода …

Из исследования, которое я сделал, код ошибки -19 возникает, когда возникает проблема с размером видео, как установлено MediaRecorder#setVideoSize()

запустите этот код и посмотрите экран whitch, который может поддерживать ваша камера на вашем устройстве:

 final List mSupportedVideoSizes = getSupportedVideoSizes(mCamera); for (Camera.Size str : mSupportedVideoSizes) Log.e(TAG, "mSupportedVideoSizes "+str.width + ":" + str.height + " ... " + ((float) str.width / str.height)); 

и метод:

 public List getSupportedVideoSizes(Camera camera) { if (camera.getParameters().getSupportedVideoSizes() != null) { return camera.getParameters().getSupportedVideoSizes(); } else { // Video sizes may be null, which indicates that all the supported // preview sizes are supported for video recording. return camera.getParameters().getSupportedPreviewSizes(); } } 

У меня была эта проблема с некоторыми конкретными телефонами, я выяснил, что в некоторых из них я не мог установить размеры профиля camcoder. Но когда это сработало для проблемных андроидов, оно перестало работать на предыдущих рабочих устройствах.

Поэтому в итоге моя реализованная логика была примерно такой:

  • Установить ширину / высоту
  • Попробуйте запустить рекордер merdia
  • В случае исключения повторите попытку, не устанавливая ширину / высоту

Вид логики мусора, но это сработало.

Я установил проект github с этой реализацией, попробуйте: https://github.com/rafaelsilverio/MediaRecorder

Я также столкнулся с этой проблемой и аннотировал следующие два способа: аппаратное обеспечение не поддерживает две конфигурации.

 MediaRecorder .setVideoSize() MediaRecorder .setVideoFrameRate() 
  • Активность kill / onCreate вызвана после съемки с помощью намерения
  • Android-камера android.hardware.Camera устарела
  • Как получить результат камеры как uri в папке с данными?
  • Android: BroadcastReceiver намерен обнаружить фотокамеру камеры?
  • Android-камера: намерение данных возвращает null
  • Давайте будем гением компьютера.