Android MediaRecorder – “inicio fallido: -19”

Intento crear un grabador de video en Android, y preparé mi código, que se supone que funciona, pero constantemente recibo un error al start failed: -19 mensaje start failed: -19 .

Aquí está mi código:

 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; } } 

Todos los registros de depuración (de “a” a “d”) se imprimen en el registro, por lo que parece que todos los pasos hasta mediaRecorder.prepare() se realizan correctamente. Luego RuntimeException una RuntimeException con el start failed: -19 mensaje start failed: -19 . Hay una pregunta similar, pero eso no resuelve mi problema.

¿Hay alguna otra razón para obtener ese error?

Acabo de descubrir el error, en esta línea:

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

después de comentar esta línea, ¡el código funciona perfectamente!

Resolví mi problema una vez que agregué esto para la grabación de video

 /** * 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; } } 

Para una guía detallada, refiérase a este código abierto Cam Cuxtom

el problema está en su código setVideoSize() .

y por qué este código de error …

De la investigación que he realizado, aparece el código de error -19 cuando hay un problema con el tamaño del video tal como lo establece MediaRecorder#setVideoSize()

ejecute este código y vea la pantalla que puede admitir su cámara en su dispositivo:

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

y el método es:

 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(); } } 

Tuve ese problema con algunos teléfonos específicos, descubrí que no podía establecer tamaños de perfil de cámara en algunos de ellos. Pero cuando eso funcionó para los androids problemáticos dejó de funcionar en los dispositivos de trabajo anteriores.

Así que, al final, mi lógica implementada fue algo así como:

  • Establecer ancho / alto
  • Intenta iniciar el grabador Merdia
  • En caso de excepción, intente de nuevo sin configurar el ancho / alto

Una especie de lógica de basura, pero funcionó.

He configurado un proyecto github con esa implementación, pruébelo: https://github.com/rafaelsilverio/MediaRecorder

También encontré este problema y anoté las dos formas siguientes, porque el hardware no es compatible con las dos configuraciones.

 MediaRecorder .setVideoSize() MediaRecorder .setVideoFrameRate()