2012-11-28 84 views
1

我一直在试图制作一个应用程序(API 8),它可以在没有音频的情况下记录视频。我已经按照Android教程中的说明操作。我的代码如下:Android MediaRecorder启动失败:-12

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一起。 我可以找到关于此错误代码的唯一其他信息是在this后,但它没有给出非常明确的答案,也没有使用任何在帖子中提到的模型。

任何人都可以帮助确定错误是什么,并提出一个解决方案?

+0

的可能重复[MediaRecorder “启动失败-12”(http://stackoverflow.com/questions/11766779/mediarecorder-start-failed-12) – wattostudios

回答

0

所以现在从来就尝试过的例子,下载的来源。我与您的代码修改了它和它的作品没有在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时准备好,并在点击按钮时启动。也许你应该尝试将它们分开,并且不要使用相机。请尝试这种方式,如果有效,请给我一个反馈。

+1

显然,如果我不使用'setProfile()',解锁相机并调用MediaRecorder.setCamera()会导致它崩溃。使用'setProfile()'似乎可以解决这个问题。我决定偷看android源代码,发现'setProfile()不仅调用setOutputFormat()和setVideoEncoder(),还调用setVideoSize(),setEncodingBitRate()和setVideoFrameRate ()'。添加这些方法调用修复了这个问题。 –

0

您尝试设置MediaRecorder配置文件吗?

recorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_LOW)); 

这里有一个类似的问题在SOF在:

MediaRecorder "start failed -12"

+0

根据Android的教程,'setOutputFormat()',' setVideoEncoder()'和'setAudioEncoder()'是使用'setProfile()'的替代方法,它直到API 8才变得可用。我不希望视频有任何声音,这就是为什么我不是使用'setProfile()' - unless'setAudioSource()'事先被调用,它会抛出一个异常,这非常强迫视频使用声音。根据文档和教程,调用'setOutputFormat()'和'setVideoEncoder()'应该能够录制没有声音的视频。 –

+0

ok。是否在解锁相机之前调用开发人员指南mCamera.open(),mCamera.setPreviewDisplay()和mCamera.startPreview()中推荐的步骤?我的意思是这个开发指南:http://developer.android.com/guide/topics/media/camera.html#capture-video – Opiatefuchs

+0

看看代码,所有的步骤都在那里。 –

相关问题