文章目录
使用Android框架采集视频需要认真的管理Camera对象,以及跟MediaRecorder类的协调。当使用Camera对象记录视频时,除了Camera.open()和Camera.release()方法的调用以外,还必须管理Camera.lock()和Camera.unlock()方法的调用,从而允许MediaRecorder对象访问Camera硬件。
采集视频需要一定的调用顺序,必须按照一个特定执行顺序来准备和采集视频,详细如下:
1. 打开Camera:
使用Camera.open()方法来获得一个Camera对象的实例。
2. 连接预览:
使用Camera.setPreviewDisplay()方法把SurfaceView跟Camera连接起来,准备一个实时的Camera图像预览界面。
设置预览中demo设置的是圆形的预览框,详情可参考绘制圆形surfaceview
3. 启动预览:
调用Camera.starPreview()方法开始显示实时的Camera图像。
4. 启动视频录像:
为了成功的记录视频,必须完成以下步骤。
4.1. 给Camera对象解锁:
通过调用Camera.unlock()方法给由MediaRecorder对象使用的Camera对象解锁。
4.2. 配置MediaRecorder对象:
在这一步中要调用以下MediaRecorder方法。更多信息,请看MediaRecorder参考文档。
4.2.1. setCamera():
使用应用程序当前的Camera实例,把它设置成用于视频采集;
4.2.2. setAudiioSource():
使用MediaRecorder.AudioSource.CAMCORDER,设置音频源;
4.2.3. setVideoSource():
使用MediaRecorder.VideoSource.CAMERA来设置视频源;
4.2.4. 设置视频的输出格式和编码:
对于Android2.2以上的版本,要使用MediaRecorder.setProfile方法,并且要私用CamcorderProfile.get()方法来获得一个Profile的示例。对于Android2.2以前的版本,必须要设置视频输出的格式和编码参数:
4.2.4.I.setOutputFormat():
设置输出格式,指定默认设置,或者是MediaRecorder.OutputFormat.MPEG_4;
4.2.4.II. setAudioEncoder():
设置声音的编码类型,指定默认设置,或者是MediaRecorder.AudioEncoder.AMR_NB;
4.2.4.III.setVideoEncoder():
设置视频的编码类型,指定默认设置,或者是MediaRecorder.VideoEncoder.MPEG_4_SP;
4.2.5. setOutputFile():
设置输出文件,可以使用下文“保存媒体文件”中的示例代码中的getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()方法来获取输出文件路径。
4.2.6. setPreviewDisplay():
给应用程序指定SurfaceView的预览布局。要使用与连接预览相同的对象。
警告:
这步中必须要调用MediaRecorder的配置方法,否则你的应用程序将会发生错误,并且录像也会失败。
4.3. 准备MediaRecorder对象:
通过调用MediaRecorder.prepare()方法,准备给MediaRecorder对象提供的配置设置。
4.4. 启动MediaRecorder对象:
通过调用MediaRecorder.star()方法来记录视频。
5. 停止视频录像:
在这步中要调用以下方法来成功完成视频记录:
5.1. 停止MediaRecorder对象:
通过调用MediaRecorder.stop()方法来停止视频采集
5.2. 重置MediaRecorder对象:
可选操作,通过调用MediaRecorder.reset()方法来删除记录器的配置设置。
5.3. 释放MediaRecorder对象:
调用MediaRecorder.release()方法来释放MediaRecorder对象。
5.4. 锁定Camera对象:
调用Camera.lock()方法来锁定Camera对象,以便MediaRecorder会话能够继续使用它。从Android4.0(API Level 14)开始,这个调用不再需要了,除非MediaRecorder.prepare()方法调用失败。
6. 停止预览:
当Activity使用完Camera对象时,要使用Camera.stopPreview()方法来停止预览。
7. 释放Camera对象:
调用Camera.release()方法来释放Camera对象,以便其他应用程序能够使用它。
提示:如果你的应用程序被用于典型的视频记录,那么在启动预览期间,把setRecordingHint(boolean)方法设置为true,这样有助于减少启动采集所需要的时间。
我的Demo写的比较简单,原本是想只当做圆形预览框的分享,后干脆加个录视频和尝试预览帧的处理。
GitHub地址如下:
https://github.com/qunqunstyle/multithreading
注:点击圆框可录制,可切换前后相机,这个demo只是为了示意预览帧onPreviewframe回调和录制视频的流程,在两者的切换时可能会有异常。