Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaRecorder“;启动失败-12“;_Android_Logcat_Mediarecorder_Error Code - Fatal编程技术网

Android MediaRecorder“;启动失败-12“;

Android MediaRecorder“;启动失败-12“;,android,logcat,mediarecorder,error-code,Android,Logcat,Mediarecorder,Error Code,所以我一直在为一个更大的应用开发一个录音模块。 它在大多数设备上都能正常工作,但有一批手机干脆拒绝录音 每当我使用MediaRecorder开始录制时,LogCat都会亲切地告诉我MediaRecorder无法启动,导致错误代码-12。 我已经在互联网上搜索了一天的大部分时间,寻找这些错误代码的解释。到目前为止,我一直很不走运。因此,我转向开发人员社区的其他人 MediaRecorder start failed -12 关于这些错误代码,已经提出了不止一个问题,更具体地说,是16、19、22

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

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

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

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


提前感谢

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

所以我替换了:

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


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

我之前的回答不完整。 经过更多的修补,我发现许多设备可能对大多数设备的默认设置非常敏感,但事实上,有许多设备的行为与您预期的不符,它们会崩溃,给您带来许多不同的错误代码,您在internet上找不到这些错误代码。这些错误代码的范围从-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在尝试使用返回错误代码-12的MP4进行录制时崩溃。使用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);
    }
尝试使用MP4编码器录制时,运行的API10Desire 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);
    }
此代码对我有效:)


在某些设备上,必须设置摄像头参数:“cam_mode”=1。这是大多数三星设备和一些htc的问题,afaik.hmm也有同样的问题,这对我不起作用。您使用的预览大小是多少?也许这有什么关系?我已经用高质量取代了低质量(正好相反),这对我来说很有效。我只是简单的评论一下:2147483648是2^31。我不知道为什么API设计者会使用这个最大值。它通常是签名ints的一部分。android只是有很多缺陷——我希望MediaCodec比MediaRecorder好得多,但它很难使用
Camera.Parameters param = mCamera.getParameters();
param.setPreviewSize(width, height);
mCamera.setParameters( param );
        camId = Main.mHelper.getFrontFacingCameraId();
        mCamera = Camera.open(camId);

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