Android MediaRecorder启动失败:-12
我一直在尝试制作一个应用程序(API 8),它可以录制视频,而不需要音频。我已经按照Android教程上的说明进行了操作。我的代码如下:Android MediaRecorder启动失败:-12,android,mediarecorder,Android,Mediarecorder,我一直在尝试制作一个应用程序(API 8),它可以录制视频,而不需要音频。我已经按照Android教程上的说明进行了操作。我的代码如下: mCamera.unlock(); recorder = new MediaRecorder(); recorder.setCamera(mCamera); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputForm
mCamera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(mCamera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
//getOutputMediaFile returns a file path where the video will be saved
recorder.setPreviewDisplay(mHolder.getSurface());
try {
recorder.prepare();
recorder.start();
recording = true;
} catch (IllegalStateException e) {
System.out.println("Error preparing recorder");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error preparing video output");
e.printStackTrace();
}
当它到达recorder.start()
时,程序崩溃,抛出无法捕获的IllegalStateException
,以及错误代码start failed:-12
。
我能找到的关于这个错误代码的唯一其他信息是在帖子中,但它没有给出一个非常明确的答案,我使用的模型也不是帖子中提到的模型
是否有人可以帮助确定错误并提出解决方案?您是否尝试设置MediaRecorder配置文件
recorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_LOW));
sof中有一个类似的问题:
因此,现在我尝试了一个示例并下载了源代码。我用你的代码修改了它,它在API 8上工作时不保存声音。以下是主要课程:
public class AndroidVideoCapture extends Activity implements SurfaceHolder.Callback{
Button myButton;
MediaRecorder mediaRecorder;
SurfaceHolder surfaceHolder;
boolean recording;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recording = false;
mediaRecorder = new MediaRecorder();
initMediaRecorder();
setContentView(R.layout.main);
SurfaceView myVideoView = (SurfaceView)findViewById(R.id.videoview);
surfaceHolder = myVideoView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
myButton = (Button)findViewById(R.id.mybutton);
myButton.setOnClickListener(myButtonOnClickListener);
}
private Button.OnClickListener myButtonOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(recording){
mediaRecorder.stop();
mediaRecorder.release();
finish();
}else{
mediaRecorder.start();
recording = true;
myButton.setText("STOP");
}
}};
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
prepareMediaRecorder();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
private void initMediaRecorder(){
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
}
private void prepareMediaRecorder(){
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
与您的代码不同的是,在本教程中没有实例化摄影机。它只适用于MediaRecorder。另一个区别是prepare()和start()方法是分开的。MediaRecorder在启动应用程序时初始化,在创建SurfaceView时准备,并在单击按钮时启动。也许你也应该试着把它们分开,不要用相机。请尝试这种方式,如果有效,请给我反馈。根据Android教程,
setOutputFormat()
,setVideoEncoder()
,setAudioEncoder()
是使用setProfile()
的替代方法,直到API 8才可用。我不希望视频有任何声音,这就是为什么我不使用setProfile()
——除非事先调用setAudioSource()
,否则它会抛出一个异常,这几乎迫使视频使用声音。根据文档和教程,调用setOutputFormat()
和setVideoEncoder()
,应该能够录制没有声音的视频。确定。在解锁相机之前,您是否调用了开发人员指南mCamera.open()、mCamera.setPreviewDisplay()和mCamera.startPreview()中建议的步骤?我是说这个开发指南:是的,但是我看不到你的相机(不是录像机)open()、setPreviewDisplay()和startPreview()的步骤。这就是为什么我要这么做。活动开始时我会打电话给他们。他们工作的很好,我可以看到预览和拍摄静态照片。好的,给我一点时间。周末我试着做我自己的录制应用程序,也许我能找到一个解决方案,或者至少能找到出现异常的原因。显然,如果我不使用setProfile()
,解锁摄像头并调用MediaRecorder.setCamera()
会导致它崩溃。使用setProfile()
似乎可以解决此问题。我决定查看android源代码,发现setProfile()
不仅调用setOutputFormat()
和setVideoEncoder()
,而且还调用setVideoSize()
,setEncodingBitRate()
,和setVideoFrameRate()
。添加这些方法调用可以解决此问题。