前言
视频录制使用的是 Camera 和前面讲过的 MediaRecorder。在视频录制的过程中你需要通过 Camera.unlock() 和 Camera.lock() 方法来允许MediaRecorder来访问硬件相机。和使用 Camera 拍摄图片不一样,拍摄视频有 严格的调用顺序。
如何使用
接下来我们就来看看该怎么玩这个玩意。
获取Camera
首先我们得获取到 Camera 。获取相机的方式这里就不在过多的说明了,如果你还是不知道可以去查看我的另外一个文章 Camera的使用。
设置预览界面
这里使用的是SurfaceView,你也可以去查看Camera的使用这篇文章。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26override fun onCreate(savedInstanceState: Bundle?) {
//...
surfaceView.holder.addCallback(this)
//...
}
override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
try {
camera?.stopPreview()
} catch (e: Exception) {
Log.d("Amoryan", "stop preview error!")
releaseCamera()
}
setupCamera()
}
override fun surfaceDestroyed(holder: SurfaceHolder?) {
}
override fun surfaceCreated(holder: SurfaceHolder?) {
checkCameraPermission()
}
开始录制
相机的准备工作做好之后就可以开始录制了。
- 通过 Camera.unlock() 允许MediaRecorder访问Camera;
- 通过 MediaRecorder.setCamera() 将MediaRecorder和Camera关联;
- 设置音频源,通过 MediaRecorder.setAudioSource() 设置音频源为 MediaRecorder.AudioSource.CAMCORDER;
- 设置视频源,通过 MediaRecorder.setVideoSource() 设置视频源为 MediaRecorder.VideoSource.CAMERA;
- 设置输出格式和编码方式,不过在 Android2.2 之后你就可以通过 MediaRecorder.setProfile() 方法来设置一个录制视频的配置;
- 通过 MediaRecorder.setOutputFile() 设置录制视频后保存的文件路径;
- 通过 MediaRecorder.setPreviewDisplay() 设置预览界面是SurfaceView;
- 经过以上的配置之后MediaRecorder就已经准备完成,之后你就可以调用 MediaRecorder.prepare() 表示你已经准备完成了;
- 通过 MediaRecorder.start() 开始录制;
停止录制
当你录制完成之后,也需要正确的释放资源。
- 通过 MediaRecorder.stop() 停止当前的录制;
- 通过 MediaRecorder.reset() 重置当前的MediaRecorder配置,以便之后其他app的使用;
- 通过 MediaRecorder.release() 将MediaRecorder释放;
- 通过 Camera.lock() 将相机资源锁住,方便其他的app进行使用;
- 通过 Camera.stopPreview() 停止相机的预览;
- 通过 Camera.release() 释放相机的资源,方便其他的app进行使用。
小技巧
如果你使用Camera来录制视频,你可以通过 setRecordingHint() 在开启预览前设置为true,这个方法能够减少开始录制的时间。
项目地址
完整代码
1 | package com.yanfangxiong.mediarecorderdemo |
毒鸡汤
走过一些弯路,也好过原地踏步~