当前位置: 首页 > news >正文

安卓录屏使用VirtualDisplay虚拟屏幕;MediaRecorder,媒体录影机;

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)

http://www.lryc.cn/news/58629.html

相关文章:

  • Java FileChannel文件的读写实例
  • 2023 年男生还推荐报计算机专业吗?
  • 【华为OD机试真题】积木最远距离(相同数字的积木游戏1)(javapython)
  • STM32F103RCT6驱动SG90舵机-完成正反转角度控制
  • 【4.13(补)】二叉搜索树的遍历、插入、删除
  • Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)
  • Java访问底层操作系统
  • Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承
  • 【计算机系统结构】第一章 计算机系统结构基本概念
  • e2fsprogs logsave Ubuntu 安装失败 unable to make backup link of ‘./usr/bin/chattr‘
  • 在排序数组中查找元素的第一个和最后一个位置(二分查找进阶)
  • 1 Nginx跨域配置
  • ChatGTP如此强大,我们普通人如何利用它来赚钱?
  • 常见的九种大数据分析模型
  • 射频识别(RFID)技术的基本原理、特性、发展和应用
  • 3.3 二维随机变量条件分布
  • Kafka——概述、安装及命令行操作
  • 怎么控制ERP企业管理系统开发的价格
  • 我在“Now In Android”中学到的 9 件事
  • ChatGPT宝藏插件丨装上之后,上网、语音聊天、一键分享对话……简直让你爽到起飞!
  • 私有句柄表
  • Vue——类与样式绑定
  • 软考中项计算题总结
  • 如何使用基于GPT-4的Cursor编辑器提升开发效率
  • 压箱底教程分享,手把手教会你如何注册target账号和下单
  • 一次性搞懂dBSPL、dBm、dBu、dBV、dBFS的区别!
  • 漂亮实用的15个脑图模板,你知道哪些是AI做的吗?
  • 历代程序员都无法逃脱的诅咒 -- 低代码
  • 14Exceptional Control Flow Exceptions and Process(异常控制流,异常和进程)
  • LeetCode - 两数之和