2017-09-15 241 views
0

什么是开始的意思失败:-38?无法启动mediarecorder的前置摄像头,它抛出IllegalStateException异常启动失败:-38

我创建了两个CameraView(预览)对象和一个相机对象。

使用处理程序我可以切换相机一段时间,比如10秒后打开后视摄像头和10秒后打开前端摄像头。

现在我面临着记录的前置摄像头的一些问题。

当我点击记录按钮时,首先会将相机记录10秒,然后将其保存到SD卡中。并在10秒后自动切换到前置摄像头进行录制。

后置摄像头记录工作正常。但是前置摄像头预览显示正确,但它不是录制视频,它说IllegalStateException start failed: -38当我打电话mediarecorder.start();

这里是代码

准备介质

mediaRecorder = new MediaRecorder(); 

    mCamera.unlock(); // lock camera for later use 


    mediaRecorder.setCamera(mCamera); // lock camera for later use 

    //mediaRecorder.setCamera(mCamera); // lock camera for later use 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    //mediaRecorder.setOrientationHint(90); 
    mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_720P)); 
    //mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); 
    //mediaRecorder.setVideoSize(320, 240); 
    //mediaRecorder.setVideoFrameRate(15); 

    //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
    long l = System.currentTimeMillis(); 
    mediaRecorder.setOutputFile("/sdcard/" + l + ".mp4"); 
    mediaRecorder.setMaxDuration(600000); // Set max duration 60 sec. 
    mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M 

    try { 
     mediaRecorder.prepare(); 
     Log.e(TAG, "prepareMediaRecorder: "); 
    } catch (IllegalStateException e) { 
     releaseMediaRecorder(); 
     return false; 
    } catch (IOException e) { 
     releaseMediaRecorder(); 
     return false; 
    } 
    Log.e(TAG, "prepareMediaRecorder: RETURN TRUE"); 

开始记录

if (!prepareMediaRecorder()) { 
     Toast.makeText(getContext(), "Fail in prepareMediaRecorder()!\n - Ended -", Toast.LENGTH_LONG).show(); 
     //finish(); 
     return; 
    } 

    try { 
     Log.e(TAG, "recordBackCameraVideo: START START "); 
     mediaRecorder.start(); 
     Log.e(TAG, "recordBackCameraVideo: START END "); 
    } catch (final Exception ex) { 
     Log.i("---", "Exception in thread"); 
    } 

    recording = true; 

停止录制

try { 
     Log.e(TAG, "stopRecording: STOP START"); 
     mediaRecorder.stop(); // stop the recording 
     Log.e(TAG, "stopRecording: STOP END"); 
    } catch (RuntimeException stopException) { 
     Log.e(TAG, "stopRecording: " + stopException.getMessage()); 
    } 
    releaseMediaRecorder(); // release the MediaRecorder object 
    Toast.makeText(getContext(), "Video captured!", Toast.LENGTH_LONG).show(); 
    recording = false; 
+0

由于您的前置摄像头不支持CamcorderProfile.QUALITY_720P此质量尝试降低质量,然后尝试它将工作先生。 –

+0

看到我的答案先生。 –

+0

相同的配置文件设置适用于演示,其中有一个按钮来切换相机,该演示正常工作正面和背面相机 –

回答

0

试试这个。首先,你需要检查CamcorderProfile.hasProfile(“CameraID”,“传递你期望的质量”),如果这是真的,那么你可以使用质量的视频录制,否则你需要使用一些其他CamcorderProfile质量。

以下代码仅仅是我在我的项目中使用,你可以根据你的需要更改代码的参考。

private boolean prepareMediaRecorder() { 
    mediaRecorder = new MediaRecorder(); 

    CamcorderProfile profile = null; 
    if (!cameraFront) { 
     profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    } else { 
     if (CamcorderProfile.hasProfile(0, CamcorderProfile.QUALITY_HIGH)) { 
      profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH); 
     } else { 
      profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_LOW); 
     } 
    } 

    mCamera.unlock(); 
    if (!cameraFront) { 
     // Back 
     mediaRecorder.setOrientationHint(90); 
    } else { 
     // Front 
     mediaRecorder.setOrientationHint(270); 
    } 
    mediaRecorder.setCamera(mCamera); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    mediaRecorder.setOutputFormat(profile.fileFormat); 
    mediaRecorder.setVideoEncoder(profile.videoCodec); 
    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
    mediaRecorder.setOutputFile(Utils.getOriginalFileName()); 
    mediaRecorder.setVideoSize(640, 480); 
    mediaRecorder.setMaxDuration(50000); // Set max duration 5 sec. 
    mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M 

    try { 
     mediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     releaseMediaRecorder(); 
     return false; 
    } catch (IOException e) { 
     releaseMediaRecorder(); 
     return false; 
    } 
    return true; 
} 
+0

相同的配置文件设置工程对于演示,那里有一键切换摄像头,并演示为正面和背面摄像头 –

+0

哪个视频大小,你正在使用用于记录视频工作正常? –

+0

我没有指定任何视频大小 –

相关问题