Android MediaRecorder - “start failed: -19”

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I'm trying to create a video recorder on Android, and I've prepared my code which is supposed to be working - but I constantly get an error message start failed: -19.

Here's my code:

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

All the debug logs (from "a" through "d") are printed in log, so it seems that all the steps upto mediaRecorder.prepare() are properly done. Then it catches a RuntimeException with message start failed: -19. There is a similar question, but that doesn't solve my problem.

Is there any other reason to get such an error?

回答1:

Just found out the bug, in this line:

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

after commenting out this line, the code runs perfectly!



回答2:

I solved my problem once i added this for video recording

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

For detailed guide refer to this Open Source Cuxtom Cam



回答3:

the problem is in your setVideoSize() code .

and why this code error ...

From the research I have done, error code -19 comes about when there is a problem with the size of the video as set by MediaRecorder#setVideoSize()

run this code , and see whitch screen that your camera in your device can support :

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

and method is :

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


回答4:

I had that problem with some specific phones, I've found out that I couldn't set camcoder profile sizes in some of them. But when that worked for the problematic androids it stopped working on the previous working devices.

So in the end my implemented logic was something like:

  • Set width/height
  • Try to start the merdia recorder
  • In case of exception, try again without setting width/height

Kind of a trash logic, but that worked.

I've setup a github project with that implementation, try it out: https://github.com/rafaelsilverio/MediaRecorder



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!