前言
GitHub源代码
随着市面上越来越多的复杂应用出现,录制视频也是一个常用的社交功能点,这篇文章就来探讨一下,如何启用Android系统的应用,以及关于Android方面录制的相关信息。
启动系统录制应用
系统录制应用的注意事项和步骤几乎和拍照的一模一样,详细的步骤我就不详细说明了,有兴趣的伙伴可以先移步拍照系统应用进行详细了解。
启动录制应用也需要使用隐式启动:
fun takeVideo(){
Intent(MediaStore.ACTION_VIDEO_CAPTURE).also {taskIntent->
taskIntent.resolveActivity(packageManager)?.also {
val photoFile=try {
createImageFiles()
}catch (ex:IOException){
null
}
Log.d("test",photoFile?.toString())
photoFile?.also {
val photoURI=FileProvider.getUriForFile(this,"com.lyc.indonesia.mediademo",it)
taskIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI)
startActivityForResult(taskIntent,REQUEST_VIDEO_CAPTURE)
}
}
}
}
该代码跟启动拍照几乎一模一样,创建自定义文件,判断是否存在系统应用,开启启动,唯一的变化在于action使用的是MediaStore.ACTION_VIDEO_CAPTURE常量。录制完毕后也是使用**Intent.getData()**获取到文件路径URI。
自定义录制小视频
自定义视频和自定义拍照有很多类似的流程,我们可以通过回归以下自定义拍照界面的流程,自定义拍照。
下面我们来整理以下自定义录制小视频的流程:
- 配置摄像头、音频、外存写入权限,Android6.0考虑运行时权限
- 打开摄像头,配置相关参数
- 开启录制视频
- 停止录制视频
- 到对应的文件夹查看视频文件
从流程中,我们就可以比较出,自定义视频和自定义拍照前边的流程基本一致,那我们本文重点把精力内容放在录制视频这一块。Android 录制视频需要用到一个辅助类MediaRecorder:
- Camera.unlock()释放锁定,让MediaRecorder可以开始录制
- MediaRecorder 做预处理相关配置
- MediaRecorder 开启录制
- MediaRecorder 停止录制
- Camera.lock() 再次锁定
- 释放MediaRecorder资源
根据以上流程,我们开始第一步进行Camera.unlock()释放锁定 and 做预处理:
public fun prepareVideoRecorder(): Boolean {
if (TextUtils.isEmpty(mPath)) {
return false
}
val mSaveFile = createFile(mPath)
mMediaRecoder = MediaRecorder()
if (mMediaRecoder == null) {
return false
}
//解锁资源,让MediaRecoder可用
mCamera?.unlock()
//设置MediaRecoder绑定的Camera
mMediaRecoder?.setCamera(mCamera)
//设置声频来源于扬声器
mMediaRecoder?.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
//设置图像来源于视频
mMediaRecoder?.setVideoSource(MediaRecorder.VideoSource.CAMERA)
//设置图片协议配置
mMediaRecoder?.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))
//设置视频输出文件
mMediaRecoder?.setOutputFile(mSaveFile)
//设置预览View对象
mMediaRecoder?.setPreviewDisplay(surfaceView.holder.surface)
try {
//开始预处理
mMediaRecoder?.prepare()
} catch (e: IllegalStateException) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.message)
releaseMediaRecorder()
return false;
} catch (e: IOException) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.message)
releaseMediaRecorder()
return false
}
return true
}
预处理主要设置绑定Camera进行关联、设置资源来源、设置输出文件、设置相关预览对象等,
做完预处理后,我们就进行录制了,程序中我使用isRecording是否正在录制,true为正在录制,为按钮设置以下程序:
if (isRecording) {
mMediaRecoder?.stop()
releaseMediaRecorder()
mCamera?.lock()
isRecording = false
btn_capture.text = "开始录制"
} else {
if (prepareVideoRecorder()) {
mMediaRecoder?.start()
isRecording = true
btn_capture.text = "停止录制"
} else {
releaseMediaRecorder()
}
}
如果isRecording为True,说明正在录制,我们需要停止录制并释放资源,如果还没有开始录制,就预处理,如果预处理返回结果正确就启动录制,否则进行资源回收,整个自定义的过程就已经结束了,大伙们可以根据自己想要的UI进行自定制,模型已经完成。