我们在使用mediarecorder进行视频录制时,往往希望摄像头能够在启动录像之前和停止录像之后也能够进行预览。这里备份下实现代码,很简单,思路为先打开摄像头,让后将摄像头的引用传递给mediarecorder。
CONTENTS
MediaRecorder:
实现方式:
1)首先打开摄像头:
camera = Camera.open(i);
2)然后在Surfaceview的Callback中启动摄像头预览:
@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { try { camera.setPreviewDisplay(holder); camera.startPreview(); } catch (IOException e) { }
至此,摄像头已经能够正常的预览了。这里开始初始化MediaRecorder:
3)初始化Mediarecorder:
mediaRecorder = new MediaRecorder(); camera.unlock(); mediaRecorder.setCamera(camera); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 。。。。。。 。。。。。。 try { mediaRecorder.setOutputFile(file); mediaRecorder.prepare(); mediaRecorder.start(); currStartTime = System.currentTimeMillis(); } catch (Exception e) { if (mediaRecorder != null) { mediaRecorder.release(); mediaRecorder = null; camera.lock(); } }
这里需要注意的是,摄像头需要先解锁才能被MediaRecorder使用。MediaRecorder的录制大小可以有摄像头的预览参数来决定。
4)Mediarecorder的释放:
try { mediaRecorder.stop(); } catch (Exception e) { e.printStackTrace(); } mediaRecorder.release(); mediaRecorder = null; camera.lock();
同样需要重新锁定摄像头。
MediaPlayer:
实现方式:
1)首先初始化MediaPlayer:
player = new MediaPlayer(); player.reset(); player.setDataSource(filePath); player.prepare();
2)其次在SurfaceView的回到函数中设置MediaPlayer的播放Holder:
@Override public void surfaceCreated(SurfaceHolder holder) { try { player.setDisplay(holder); } catch (Exception e) { e.printStackTrace(); } }
通过作者实践可以发现,当player.prepare()函数调用之后,仍然可以调用player.setDisplay()函数。
3)调用MediaPlayer的方法进行控制播放:
player.seekTo(0); player.start(); player.pause(); player.stop(); player.release();
备注:
1)mediaplayer和mediarecorder的函数调用顺序有严格的限制,用起来比较麻烦。除了多看API的介绍外,自己也可以多试验一下其他的调用方式。
2)除了MediaPlayer之外,使用VideoView也可以播放视频,这里就先不备注代码了。
发表评论