【问题标题】:Video recording error in androidandroid中的视频录制错误
【发布时间】:2015-12-31 06:13:52
【问题描述】:

我需要将视频文件录制为 mp4 格式。但是,当我运行并单击记录按钮时,它会抛出类似 FATAL EXCEPTION: main 的错误 java.lang.IllegalStateException 。 这是我的全部代码

boolean recording = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_final_example);
    initUI();
    initRecorder();
    buttonStopVid.setEnabled(false);
    buttonPlayVid.setEnabled(false);
    buttonStartVid.setOnClickListener(this);

    holder = surfaceView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

protected void initUI(){
    buttonStartVid = (Button) findViewById(R.id.buttonStartRecordVid);
    buttonPlayVid = (Button) findViewById(R.id.buttonPlayVid);
    buttonStopVid = (Button) findViewById(R.id.buttonStopRecordVid);
    videoView = (VideoView) findViewById(R.id.videoView);
    surfaceView = (SurfaceView) findViewById(R.id.surface_camera_final);
}

@Override
public void onClick(View v) {
    if(v.getId() == R.id.buttonStartRecordVid){
        buttonStartVid.setEnabled(false);
        buttonStopVid.setEnabled(true);

        surfaceView.setVisibility(View.VISIBLE);
        prepareRecorder();
        recording = true;
        recorder.start();

    }
    if(v.getId() == R.id.buttonStopRecordVid){
        buttonPlayVid.setEnabled(true);
        buttonStartVid.setEnabled(true);
        buttonStopVid.setEnabled(false);
        surfaceView.setVisibility(View.GONE);

        recorder.stop();
        recording = false;
        initRecorder();
        prepareRecorder();
    }
    if(v.getId() == R.id.buttonPlayVid){

    }
}

protected void initRecorder(){
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

    CamcorderProfile cp = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    recorder.setProfile(cp);

    try{
        File newFile = File.createTempFile("vid", ".mp4", Environment.getExternalStorageDirectory());
        recorder.setOutputFile(newFile.getAbsolutePath());
    }
    catch (IOException e){
        e.printStackTrace();
    }
}

private void prepareRecorder() {

    recorder.setPreviewDisplay(holder.getSurface());

    try {
        recorder.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    prepareRecorder();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if(recording){
        recorder.stop();
        recording = false;
    }
    recorder.release();
}

关于可能导致此问题的原因以及如何解决此问题的任何想法?谢谢!

【问题讨论】:

  • 请在您的问题中添加 logcat 完整错误?

标签: android android-mediaplayer surfaceview android-mediarecorder


【解决方案1】:

使用此链接 http://developer.android.com/reference/android/media/MediaRecorder.html

它将提供您需要的完整信息。

【讨论】:

    【解决方案2】:

    看起来您的 prepareRecorder() 函数将被多次调用,这将导致 MediaRecorder 抛出非法状态异常。 MediaRecorder 具有您需要牢记的状态机。您需要知道您的 MediaRecorder 处于哪个状态,然后进行相应的处理。从您的异常日志中,它说 MediaRecorder 在错误的状态下执行错误的过程。我认为 http://developer.android.com/reference/android/media/MediaRecorder.html 可能对您来说是一个很好的文档。

    【讨论】:

      猜你喜欢
      • 2013-04-14
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多