android 中的视频录制错误
Video recording error in android
我需要将视频文件录制成 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();
}
关于可能导致此问题的原因以及如何解决它的任何想法?谢谢!
看起来你的prepareRecorder() 函数会被调用很多次,这会导致MediaRecorder 抛出illegalState 异常。 MediaRecorder 具有您需要牢记的状态机。你需要知道你的MediaRecorder是哪个状态,然后做相应的处理。从您的异常日志中,它说 MediaRecorder 正在错误地执行错误的过程 state.I 认为 http://developer.android.com/reference/android/media/MediaRecorder.html 可能是适合您的文档。
使用这个link
http://developer.android.com/reference/android/media/MediaRecorder.html
它将提供您需要的完整信息。
我需要将视频文件录制成 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();
}
关于可能导致此问题的原因以及如何解决它的任何想法?谢谢!
看起来你的prepareRecorder() 函数会被调用很多次,这会导致MediaRecorder 抛出illegalState 异常。 MediaRecorder 具有您需要牢记的状态机。你需要知道你的MediaRecorder是哪个状态,然后做相应的处理。从您的异常日志中,它说 MediaRecorder 正在错误地执行错误的过程 state.I 认为 http://developer.android.com/reference/android/media/MediaRecorder.html 可能是适合您的文档。
使用这个link http://developer.android.com/reference/android/media/MediaRecorder.html
它将提供您需要的完整信息。