MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)

Posted

技术标签:

【中文标题】MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)【英文标题】:MediaRecorder fails on start on some devices (start failed: -2147483648 and -19) 【发布时间】:2013-12-31 06:54:51 【问题描述】:

我已经阅读了有关MediaRecorder and followed the GUIDES on android 的所有内容。

好吧,它至少可以在 API 8 或更高版本上正常工作,但我的最低 SDK 是 14,所以我应该会更好。

在我的设备上,三星 Galaxy S3 Mini 运行良好。其他一些带有冰淇淋三明治的设备,但有些没有。他们崩溃了:

mediaRecorder.start()

我创建了一个用于录制视频的服务,这是我的代码(我在每个阶段所做的指南):

    @Override
public void surfaceCreated(SurfaceHolder surfaceHolder) 

    //OPEN CAMERA
    int ncamara=0;
    qcamara=0;
    if(android.os.Build.VERSION.SDK_INT<9)
        camera = Camera.open();                                       
    else
    try 
        ncamara = Camera.getNumberOfCameras();
        if (f.leer("camara", context).equals("frontal"))
            qcamara=10;
        else qcamara=20;
     catch (Exception e) 
    if (ncamara>=2 && qcamara == 10)
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
    else if (ncamara>=2 && qcamara == 20)
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
    else
        camera = Camera.open();
    
                                                                        //
    try 
        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();
     catch (IOException e1) 
        e1.printStackTrace();
    
    //UNLOCK CAMERA
    camera.unlock();    
    mediaRecorder = new MediaRecorder();

    mediaRecorder.setCamera(camera);                                    //setCamera
    mediaRecorder.setAudiosource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

                                                                        //setProfile
    if (f.leer("calidad", context).equals("alta") && qcamara !=10)
        mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH));
    else if (f.leer("calidad", context).equals("alta") && qcamara == 10)
        mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));
    else if (f.leer("calidad", context).equals("baja") && qcamara != 10)
    mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_LOW));
    else
        mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));

    mediaRecorder.setVideoSize(320, 240);   

    if (CameraRecorder.duracion>0)                                      // -- duration
    mediaRecorder.setMaxDuration(CameraRecorder.duracion * 1000);


    File dataDirectory = Environment.getExternalStorageDirectory();
    File fileDir = new File(dataDirectory, "/weddingR/");
    fileDir.mkdirs();
    mediaRecorder.setOutputFile(                                        //setOutputFile
            Environment.getExternalStorageDirectory()+"/weddingR/"+
            DateFormat.format("yyyy-MM-dd---kk-mm-ss", new Date().getTime())+
            ".mp4"
    );
    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());  
    if (qcamara==10) // FRONT CAMERA
        try  mediaRecorder.setOrientationHint(270);  catch (Exception e) 
     else  // BACK CAMERA
        try  mediaRecorder.setOrientationHint(90);  catch (Exception e) 
    
    try  
        mediaRecorder.prepare();
         catch (Exception e) 
    mediaRecorder.setOnInfoListener(new OnInfoListener()

        @Override
        public void onInfo(MediaRecorder mr, int what, int extra) 
            Log.d("INFO_ON", what + " " + extra + " ");
            nascosto=true;
            stopSelf();
        
    );

    mediaRecorder.start();

例如,如果我设置mediaRecorder.setVideoFrameRate(20),它会在每台设备上崩溃。

我最常问的问题是,某些设备可以正常工作,但其他设备不能正常工作(例如,具有 API 17 或 18 的 EMULATOR 可以工作……具有 API 15 的设备可以工作,但 EMULATOR API 15 不能工作……)

我做错了什么??

提前致谢。


ANDROID 清单权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

编辑

@Melquiades 回答后,我编辑了我的代码,现在捕捉异常,没有捕捉到异常。

另外,我想指出一些有趣的事情:我正在尝试使用 API15 模拟器并且发生了这种情况:

    当我设置mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());(在mediaRecorder.setOutputFile()之后),我得到START FAILED -19 当我不设置它时,我得到START FAILED -2147483648

但在我的三星中它仍然可以正常工作......


新编辑(01/01/2014)新年快乐!!

我在三星 Galaxy S2 Plus(Android 4.1.2)上试过,但它不起作用,但在我的三星 Galaxy S3 Mini 上它可以工作(也是 Android 4.1.2)......我快疯了。

【问题讨论】:

你应该先解锁相机再做 camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); 在您回答之后,我在 *** 上阅读了一些内容,建议在调用 surfaceChanged() 时设置 camera.setPreviewDisplay(surfaceHolder);camera.startPreview();。我这样做了,但仍然出现错误。 【参考方案1】:

当调用 mediaRecorder.prepare() 时,你没有做任何捕获异常的事情:

try  
    mediaRecorder.prepare();
 catch (Exception e)  //empty??? 

不要这样做。这是一个不好的做法。如果有任何例外,您将不会知道。

在 中放置一个 Log.d() 并查看 prepare() 期间发生了什么。对你捕获的所有异常执行此操作。

来自该指南:

// Step 6: Prepare configured MediaRecorder
try 
    mMediaRecorder.prepare();
 catch (IllegalStateException e) 
    Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
    releaseMediaRecorder();
    return false;
 catch (IOException e) 
    Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
    releaseMediaRecorder();
    return false;

【讨论】:

您好,感谢您的回答。我不习惯做那种不好的做法,但谢谢你提醒我。我正在捕捉异常,我没有异常。它只是崩溃。我正在编辑我的 EDIT,这样你就可以知道如果我修改了一些参数会发生什么。

以上是关于MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些搭载 Android 10 的设备上为空

从 MIC 录制并流式传输到 TCP 服务器; MediaRecorder:启动失败:-38

MediaRecorder:启动失败:-19

Android mediaRecorder Stop 失败 - 尝试指定设备的最高记录质量

Android 无法使用前置摄像头录制视频,MediaRecorder 启动失败:-19

MediaRecorder.stop() 停止失败:-1007