Android MediaRecorder - “start failed: -19”

我的未来我决定 提交于 2019-12-17 06:16:08

问题


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<Camera.Size> 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<Size> 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




回答5:


I also encountered this problem and annotated the following two ways, because the hardware does not support the two configurations.

MediaRecorder .setVideoSize()
MediaRecorder .setVideoFrameRate()


来源:https://stackoverflow.com/questions/10496969/android-mediarecorder-start-failed-19

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