安卓录屏使用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)
相关文章:
安卓录屏使用VirtualDisplay虚拟屏幕;MediaRecorder,媒体录影机;
1.跟截屏一样,判断权限,然后在onActivityResult里面给mediaProjection赋能; 2.初始化录像机: //初始化Recorder录像机 fun initRecorderStart() { //新建Recorder val displayMetrics DisplayMetrics() val width displayMetri…...
Java FileChannel文件的读写实例
一、概述: 文件通道FileChannel是用于读取,写入,文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率,他们读和写直接建立了通道&#x…...
2023 年男生还推荐报计算机专业吗?
计算机专业确实是一个非常热门的专业,就业前景也很广阔。 但是,近些年随着各个大学对计算机专业及其相关专业疯狂扩招,而且每年的毕业人口都在增多,行业是根本容纳不下的,就业竞争力度也急剧上升。因此,选…...
【华为OD机试真题】积木最远距离(相同数字的积木游戏1)(javapython)
相同数字的积木游戏1 知识点数组循环map 时间限制:1s 空间限制:256MB 限制语言:不限 题目描述: 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数…...
STM32F103RCT6驱动SG90舵机-完成正反转角度控制
一、SG90舵机介绍 SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械…...
【4.13(补)】二叉搜索树的遍历、插入、删除
文章目录二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 因为二叉搜索树是有序的,第一次找到p和q中间的值,就是最近的公共祖先…...
Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)
Web 攻防之业务安全:Callback自定义测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业务所提…...
Java访问底层操作系统
native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机…...
Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承
原文:http://inventwithpython.com/beyond/chapter16.html 定义一个函数,并从几个地方调用它,可以省去复制和粘贴源代码的麻烦。不复制代码是一个很好的实践,因为如果你需要修改它(无论是为了修复一个错误还是添加新特…...
【计算机系统结构】第一章 计算机系统结构基本概念
文章目录第一章 计算机系统结构基本概念1.1 计算机系统结构的概念1.2 计算机体系结构的发展1.3 系统结构中并行性的发展1.4 系统结构的设计1.5 定量分析技术基础第一章 计算机系统结构基本概念 课程内容 A I P S N 工业革命 1.1 计算机系统结构的概念 引言 第一台通用计算机 …...
e2fsprogs logsave Ubuntu 安装失败 unable to make backup link of ‘./usr/bin/chattr‘
最近给服务器从 Ubuntu 18.04 LTS 升级到 20.04 LTS,过程中崩溃,重新尝试执行,提示依赖错误。这时候 apt install 所有的东西都会报错,提示依赖不满足。(这里的报错忘了复制了)执行 apt upgrade 也是一样。…...
在排序数组中查找元素的第一个和最后一个位置(二分查找进阶)
在写这个题目之前需要大家自行看一下我之前写的博客有关二分查找思想,如何判断什么时候使用二分查找以及边界值的确定:二分查找思想力扣实例_徐憨憨!的博客-CSDN博客 题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定…...
1 Nginx跨域配置
跨域问题在之前的单体架构开发中,其实是比较少见的问题,除非是需要接入第三方SDK时,才需要处理此问题。但随着现在前后端分离、分布式架构的流行,跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…...
ChatGTP如此强大,我们普通人如何利用它来赚钱?
我从效率提升的角度,分享了我这段时间看到的、用到的,以及思考的一些内容。 最近这段时间,我算是密集的学习。不得不说,优质的资料在推特和油管上特别多,看科技大佬的分享真是一种享受。 很多大神也会录制各种详细的…...
常见的九种大数据分析模型
常见的9种大数据分析模型分别为: 事件分析、 属性分析、 渠道分析、 Session分析、 留存分析、 归因分析、 漏斗分析、 路径分析、 分布分析 1、【事件分析】 事件分析,是指用户在 APP、网站等应用上发生的行为,即何人,何时&…...
射频识别(RFID)技术的基本原理、特性、发展和应用
何谓射频识别 随着高科技的蓬勃发展,智能化管理已经走进了人们的社会生活,一些门禁卡、第二代身份证、公交卡、超市的物品标签等,这些卡片正在改变人们的生活方式。其实秘密就在这些卡片都使用了射频识别技术,可以说射频识别已成…...
3.3 二维随机变量条件分布
学习目标: 要学习二维随机变量的条件分布,我可能会采取以下步骤: 复习边缘分布和联合分布:首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率:学习条件概率的定义和计算公式&#x…...
Kafka——概述、安装及命令行操作
文章目录一、概述1.1、定义1.2、如何运作?1.3、传统消息队列的应用场景1.4、消息队列的两种模式1.5、Kafka的基础架构二、安装(需要安装zookeeper)三、常用命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作一、概述…...
怎么控制ERP企业管理系统开发的价格
企业资源规划(ERP)是一种广泛使用的商业软件系统,用于管理企业的各个方面,包括财务、供应链、客户关系、人力资源等等。开发一个适合企业的ERP系统可能是一项昂贵的任务,但控制ERP企业管理系统开发的价格是可行的。以下…...
我在“Now In Android”中学到的 9 件事
我在“Now In Android”中学到的 9 件事 Now in Android是一款功能齐全的 Android 应用程序,完全使用 Kotlin 和 Jetpack Compose 构建。它遵循 Android 设计和开发最佳实践,旨在为开发人员提供有用的参考。 https://github.com/android/nowinandroid UI…...
从零开始深度学习:PyTorch 2.8镜像环境配置与验证教程
从零开始深度学习:PyTorch 2.8镜像环境配置与验证教程 1. 为什么选择PyTorch 2.8镜像? 深度学习环境配置一直是让开发者头疼的问题,特别是当需要GPU加速时,PyTorch版本、CUDA工具包、显卡驱动之间的兼容性问题常常让人望而却步。…...
阿里开源神器CosyVoice2体验:用四川话、高兴语气说话,AI语音控制真简单
阿里开源神器CosyVoice2体验:用四川话、高兴语气说话,AI语音控制真简单 1. 快速体验:3秒克隆你的声音 1.1 一键部署指南 作为阿里云开源的轻量级语音克隆工具,CosyVoice2-0.5B的部署简单到令人惊讶。只需在服务器上执行以下命令…...
放弃OpenVINO!在树莓派5上用Anaconda环境直接跑通YOLOv5摄像头检测
放弃OpenVINO!在树莓派5上用Anaconda环境直接跑通YOLOv5摄像头检测 树莓派作为嵌入式开发的明星产品,其第五代在性能上有了显著提升,4GB内存和2.4GHz四核处理器让它能够胜任更多AI推理任务。而YOLOv5作为目标检测领域的轻量级标杆,…...
Unity游戏开发实战:用三阶贝塞尔曲线为你的角色设计一条丝滑的移动路径(附完整C#脚本)
Unity游戏开发实战:三阶贝塞尔曲线打造丝滑角色移动路径 想象一下,你的游戏角色需要完成一个优雅的空中翻转动作,或者赛车需要在弯道实现完美漂移轨迹。这些令人惊叹的运动效果背后,往往隐藏着一条看不见的数学曲线——贝塞尔曲线…...
WordPress建站避坑指南:Ubuntu服务器常见权限问题与安全配置
WordPress建站避坑指南:Ubuntu服务器常见权限问题与安全配置 引言:为什么你的WordPress网站总出问题? 每次看到新手开发者兴奋地宣布"我的WordPress网站上线了",我都忍不住想问:你真的检查过文件权限了吗&am…...
利用ADS实现多频段阻抗自动优化的实战指南
1. 从零开始理解多频段阻抗匹配 刚入行那会儿,我对阻抗匹配的理解还停留在"把50欧姆搞对就行"的层面。直到某次调试一个同时工作在900MHz和2.4GHz的双频天线时,才发现单频段匹配的思路完全不够用——调好了低频段,高频段性能就崩了…...
别再死磕ECharts了!试试这个Vue关系图谱插件relation-graph,上手快效果好
从ECharts到relation-graph:Vue关系图谱开发的效率革命 如果你正在使用Vue开发需要展示复杂关系网络的应用,可能已经尝试过ECharts的关系图功能。但当你需要更专业的交互体验、更直观的数据表达时,relation-graph这个专为Vue设计的关系图谱插…...
Qwen3-4B-Instruct-2507从入门到精通:Chainlit界面定制化教程
Qwen3-4B-Instruct-2507从入门到精通:Chainlit界面定制化教程 1. 引言:为什么选择Qwen3-4B-Instruct-2507? 如果你正在寻找一个既强大又轻量、既能快速部署又能灵活定制界面的AI模型,那么Qwen3-4B-Instruct-2507绝对值得你深入了…...
OpenClaw技能分享:GLM-4.7-Flash驱动的邮件自动处理系统
OpenClaw技能分享:GLM-4.7-Flash驱动的邮件自动处理系统 1. 为什么需要自动化邮件处理 每天早晨打开邮箱,看到堆积如山的未读邮件总让人头皮发麻。作为一个小团队的负责人,我经常需要处理客户咨询、内部沟通、会议邀请等各种类型的邮件。最…...
欧拉Euler~21.10系统下OpenSSH 9.0升级与安全加固实战指南
1. 环境准备:从零搭建OpenSSH 9.0升级基础 在欧拉Euler~21.10系统上升级OpenSSH,就像给老房子换新门窗——既要保证新功能正常使用,又不能破坏原有结构。我最近刚在测试环境完成这套操作,整个过程踩过几个坑,这里把完整…...
