1.跟截屏一样,判断权限,然后在onActivityResult里面给mediaProjection赋能;
2.初始化录像机:
//初始化Recorder录像机
fun initRecorderStart() {
//新建Recorder
val displayMetrics = DisplayMetrics()
val width = displayMetrics.widthPixels
val height = displayMetrics.heightPixels
val density = displayMetrics.densityDpi
mediaRecorder = MediaRecorder()
//设置录像机的一系列参数
//设置音频来源
mediaRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC)
//设置视频来源
mediaRecorder!!.setVideoSource(MediaRecorder.VideoSource.SURFACE)
//设置视频格式为mp4
mediaRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
//设置视频存储地址,返回的文件夹下的命名为当前系统事件的文件
videoPath = getSaveDirectory() + System.currentTimeMillis() + “.mp4”
Log.e(“SSSS+++”, “videoPath” + videoPath)
//此电脑\Redmi K30 5G\内部存储设备\录屏文件
//保存在该位置
mediaRecorder!!.setOutputFile(videoPath)
//设置视频大小,清晰度
mediaRecorder!!.setVideoSize(500, 800)
//设置视频编码为H.264
mediaRecorder!!.setVideoEncoder(MediaRecorder.VideoEncoder.H264)
//设置音频编码
mediaRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
//设置视频码率
mediaRecorder!!.setVideoEncodingBitRate(2 * 1920 * 1080)
mediaRecorder!!.setVideoFrameRate(18)
//初始化完成,进入准备阶段,准备被使用
//截获异常,处理
try {
mediaRecorder!!.prepare()
} catch (e: IOException) {
e.printStackTrace()
//异常提示
Toast.makeText(
this,
“Recorder录像机prepare失败,无法使用,请重新初始化!”,
Toast.LENGTH_SHORT
).show()
}
}
3.开启虚拟屏幕:
fun createVirtualDisplayS() {
//虚拟屏幕通过MediaProjection获取,传入一系列传过来的参数
//可能创建时会出错,捕获异常
try {
mVirtualDisplay = mediaProjection!!.createVirtualDisplay(
“VirtualScreen”, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_DPI,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder!!.surface, null, null
)
} catch (e: java.lang.Exception) {
e.printStackTrace()
Toast.makeText(this, “virtualDisplay创建录屏异常,请退出重试!”, Toast.LENGTH_SHORT).show()
}
}
3.将视频文件存起来:
//获取存储文件夹的位置
fun getSaveDirectory(): String? {
return if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
//如果确认为视频类型,设置根目录,绝对路径下的自定义文件夹中
val rootDir = Environment.getExternalStorageDirectory()
.absolutePath + “/” + “录屏文件” + “/”
//创建该文件夹
val file = File(rootDir)
if (!file.exists()) {
//如果该文件夹不存在
if (!file.mkdirs()) {
//如果没有创建成功
return null
}
}
//创建成功了,返回该目录
rootDir
} else {
//不是音视频文件,不保存,无路径
null
}
}
(https://juejin.cn/post/6982854696553676808)