MediaRecorder“开始失败-12”

时间:2012-08-01 20:05:41

标签: android logcat mediarecorder error-code

所以我一直在为更大的应用程序开发录音模块。 它在大多数设备上都功能齐全,但有一批手机只是拒绝录制。

每当我使用MediaRecorder开始录制时,LogCat都会慷慨地告诉我MediaRecorder无法启动,导致错误代码-12。 我一整天都在搜索互联网,寻找这些错误代码的解释。到目前为止,我一直不走运。因此,我将自己转向开发者社区的其他成员。

MediaRecorder start failed -12

关于这些错误代码已经提出了不止一个问题,更具体地说是16,19,22和一个可笑的大数字2147483648,但是这个信息在我的案例中证明是无用的。

有谁知道我在哪里可以找到可靠的MediaRecorder错误代码列表,包括这些错误代码的含义?或者甚至更好,向我解释一下全能的Android oracle试图向我发出信号?

提前致谢

3 个答案:

答案 0 :(得分:4)

我之前的回答并不完整。 经过更多的修改后,我发现很多设备对大多数设备默认的设置都非常敏感,但实际上有很多设备没有按照你期望的方式运行,它们会崩溃,给你带来许多不同的错误您无法在互联网上找到的代码。这些错误代码的范围从-12,-19,-21到-100等,并且大多数错误代码可以通过使用以下提示来解决。我将在下面列出一些简短的发现:

运行 API 10 HTC ChaCha 不会使用H264编码器进行录制。我使用MP4和/或H263工作,但视频仍然完全失真。解决方法是将相机预览大小设置为640 * 480,而不是使用谷歌自己的“最佳预览”方法,该方法返回576 * 432。通过设置此模型的例外情况,我能够完美地记录它。

运行 API 10 Galaxy Y 在尝试使用H264进行录制时崩溃。这个使用MP4编码器是个例外。修正了它。

运行 API 10 Galaxy Ace 在尝试使用MP4返回错误代码-12进行录制时崩溃。使用H264编码器为此设备模型添加例外可解决此问题。

尝试使用MP4编码器进行录制时, Desire Z 运行 API 10 会崩溃。给我一个错误-100(媒体服务器死了)。使用H264解决了这个问题。

if(API >=11){
        if(CamcorderProfile.hasProfile(mCamId, CamcorderProfile.QUALITY_480P)) {
            Log.d(TAG, "API 11+ 480P");
            mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_480P));
            mMediaRecorder.setVideoSize(640, 480);
            mMediaRecorder.setVideoEncodingBitRate(2000000);
        } else {
            Log.d(TAG, "API 11+ LOW");
            mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_LOW));
        }
    } else if (API < 11 && !MODEL.equals("GT-S5830") && !MODEL.equals("vision")){
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        Log.d(TAG, "API 9 device, defaulting");
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoEncodingBitRate(2000000);
    } else if ((API < 11) && MODEL.equals("GT-S5830") || MODEL.equals("vision")) {
        //Galaxy Ace and Desire Z
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoSize(640, 480);
        mMediaRecorder.setVideoEncodingBitRate(2000000);
    }

我打赌我会遇到更多的模型,这是一个隐喻性的痛苦,当我这样做时,我会将它们添加到列表中。 总结一下;如果您遇到这些烦人的,几乎无法解释的错误代码,请查看MediaRecorder参数。我建议不要将CamcorderProfile类用于任何低于11的API,因为许多这些模型在使用高质量的实例时会崩溃。 如果您的录像机视频文件显示奇怪的绿色,在屏幕上运行的半对角线等,请尝试设置预览尺寸以匹配录像机视频大小。

Camera.Parameters param = mCamera.getParameters();
param.setPreviewSize(width, height);
mCamera.setParameters( param );

答案 1 :(得分:1)

我找到了解决我遇到的问题的方法。 事实证明并非所有设备都支持高质量录制。我认为这是相对的,这意味着高质量是该设备的最高质量而不是常数。

所以我换了:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_HIGH));`

使用:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_LOW));`

并解决了这个问题。现在唯一的问题就是如何定义设备支持的最高质量而不会使其在运行时崩溃。

答案 2 :(得分:0)

这段代码对我有用:)

        camId = Main.mHelper.getFrontFacingCameraId();
        mCamera = Camera.open(camId);

        Camera.Parameters param = mCamera.getParameters();
        param.set( "cam_mode", 1 );     
        mCamera.setParameters(param);