【问题标题】:MediaRecorder "start failed -12"MediaRecorder“启动失败-12”
【发布时间】:2012-07-30 19:03:01
【问题描述】:

所以我一直在为一个更大的应用程序开发一个记录模块。 它在大多数设备上都可以正常工作,但有一批手机会拒绝录音。

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

MediaRecorder start failed -12

关于这些错误代码的问题已经问过不止一个问题,更具体地说是 16、19、22 和一个大得离谱的数字 2147483648,但事实证明,这些信息对我来说毫无用处。

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

提前致谢

【问题讨论】:

  • 简单评论一下:2147483648 是 2^31。不知道 API 设计者为什么会使用这个最大值。它通常是有符号整数范围的一部分。

标签: android logcat mediarecorder error-code


【解决方案1】:

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

所以我换了:

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

与:

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

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

【讨论】:

  • 在某些设备上,您必须设置相机参数:“cam_mode”=1。这适用于大多数三星设备和一些 htc,afaik。
  • 嗯有同样的问题,这对我不起作用。您使用什么预览尺寸?也许这有某种关系?
  • 我已经用高品质代替了低品质(完全相反),这对我有用)lol
【解决方案2】:

我之前的回答不完整。 经过更多的修补后,我发现许多设备可能对您认为大多数设备的默认设置非常敏感,但实际上有许多设备的行为方式与您预期的不同,它们会崩溃,给您带来许多不同的错误您将无法在 Internet 上找到的代码。这些错误代码的范围从 -12、-19、-21 到 -100 等,并且这些错误代码中的大部分都可以通过使用以下提示来解决。我将在下面列出一份简短的调查结果:

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

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

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

在尝试使用 MP4 编码器录制时,运行 API 10Desire Z 崩溃。给我一个错误-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 参数。我建议不要对任何低于 11 的 API 使用 CamcorderProfile 类,因为其中许多模型在使用它的高质量实例时会崩溃。 如果您的录像机视频文件显示奇怪的绿色、穿过屏幕的半对角线等,请尝试将预览大小设置为与录像机视频大小相匹配。

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

【讨论】:

【解决方案3】:

这段代码对我有用:)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2012-06-30
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多