我正在尝试创建一个简单的录像机,这是我的代码,以便我称之为:
protected boolean prepareForVideoRecording() {
try {
mCamera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mMediaRecorder.setOutputFile(getOutputMediaFile1(MEDIA_TYPE_VIDEO).toString());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
try {
mMediaRecorder.prepare();
Toast.makeText(getContextOfMainFragment(), "Prepared!", Toast.LENGTH_SHORT).show();
} catch (IllegalStateException e) {
Log.e(TAG,"IllegalStateException when preparing MediaRecorder "+ e.getMessage());
e.getStackTrace();
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.e(TAG,"IOException when preparing MediaRecorder "+ e.getMessage());
e.getStackTrace();
releaseMediaRecorder();
return false;
}
return true;
} catch (Exception e) {
return false;
}
}
请忽略吐司消息,我有时会使用它们进行调试。接下来,唯一剩下的就是调用mMediaRecorder.start() 我按下按钮即可完成此操作。事实上,我已经添加了2个按钮,第一个按钮调用上面的方法,另一个按钮进行启动调用。我确信这个代码一次对我有用,我不知道为什么它不再起作用了。
我在我的mMediaRecorder.start()调用中添加了一个try catch,带有IllegalStateException,这是我得到的:
04-09 10:38:18.350: E/MediaRecorder(29678): start failed: -38
04-09 10:38:18.350: E/VideoTut_Main(29678): Illegal state exception with MediaRecorder.Start() : null
答案 0 :(得分:3)
我在blog中写了一篇关于这类问题的长篇文章。总结一下(至少据我所知)有三种设置Android mediarecorder的方法,对于每种方法,我手上都有一个设备,这个方法不起作用。因此,您需要用户尝试在他的设备上使用哪种方法。方法如下:
getSupportedVideoSizes()
获得的其中一种显式视频尺寸。方法1.和3.要求明确设置输出格式,音频编码器和视频编码器,我总是使用MediaRecorder.OutputFormat.THREE_GPP
,MediaRecorder.AudioEncoder.AMR_NB
和MediaRecorder.VideoEncoder.MPEG_4_SP
。
我在Google Play中有一个名为Video Timer的小型免费应用,它已经实现了所有这三种方法,因此您可以轻松试用适用于Nexus 5的方法。