Android14 屏幕录制(屏幕投影)和音频播放采集
Android 5开始支持屏幕采集, Android 10支持音频播放采集,不过Android 14用前台服务做屏幕录制时要增加一些处理.
1. app manifest 需要增加:
<manifest><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" /><application android:resizeableActivity="true"><serviceandroid:name="xxx.yyy.MyTestService"android:foregroundServiceType="mediaProjection"android:exported="false"></service></application>
</manifest>
2. 需要用户先授权投影权限(投影 token), 再在前台服务中调用:
startForeground(id, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION);
3. 在前台服务中调用MediaProjectionManager.getMediaProjection之前, 需要先调用上面的代码。
4. 用户授权的投影token只能使用一次,就是说只能拿来调用MediaProjectionManager.getMediaProjection一次,也只能调用MediaProjection.createVirtualDisplay。
音频播放采集从 Android 10就有了,需要 RECORD_AUDIO 权限和MediaProjection对象。音频播放采集是依赖屏幕投影的,如果屏幕投影关闭了,音频播放也就采不到了。
具体实现时用到的Android接口不多,但遇到各种问题就很磨人,为方便项目使用,做了封装,支持屏幕采集、音频播放和麦克风采集,同时能输出RTMP流和RTSP流,也支持写录像文件(MP4文件), 接口如下:
/*
* Copyright (C) 1130758427@qq.com. All rights reserved.
* 问题沟通微信: ldxevt
*/public interface NTStreamMediaEngine {void register_callback(Callback callback);void unregister_callback(Callback callback);void set_resolution_level(int level);int get_resolution_level();/** 启动媒体投影*/boolean start_video_capture(int token_code, android.content.Intent token_data);boolean is_video_capture_running();void stop_video_capture();/** 启动麦克风*/boolean start_audio_record(int sample_rate, int channels);boolean is_audio_record_running();void stop_audio_record();/** Android 10及以上支持, Android10以下设备调用直接返回false* 需要有RECORD_AUDIO权限* 要开启媒体投影*/boolean start_audio_playback_capture(int sample_rate, int channels);boolean is_audio_playback_capture_running();void stop_audio_playback_capture();/** 输出的音频类型* 0: 不输出音频* 1: 输出麦克风* 2: 输出audio playback(Android 10及以上支持)*/boolean set_audio_output_type(int type);int get_audio_output_type();void set_fps(int fps);void set_gop(int gop);boolean set_video_encoder_type(int video_encoder_type);int get_video_encoder_type();/** 推送RTMP*/boolean start_rtmp_stream(String url);boolean is_rtmp_stream_running();String get_rtmp_stream_url();void stop_rtmp_stream();/** 启动RTSP Server, 需要设置端口,用户名和密码可选*/boolean start_rtsp_server(int port, String user_name, String password);boolean is_rtsp_server_running();void stop_rtsp_server();/** 发布RTSP流*/boolean start_rtsp_stream(String stream_name);boolean is_rtsp_stream_running();String get_rtsp_stream_url();void stop_rtsp_stream();/** 启动本地录像*/boolean start_stream_record(String record_directory, int file_max_size);boolean is_stream_recording();void stop_stream_record();boolean is_stream_running();interface Callback {void on_nt_video_capture_stop();void on_nt_rtsp_stream_url(String url);}
}
安卓Demo测试界面:

Windows上播放效果截图:

我测试时先开启安卓屏幕录制Demo, 在电脑上开个计数器,再打开安卓相机拍摄屏幕上的计数器,录制程序采集安卓相机预览界面,并输出RTMP流和RTSP流, 电脑上播放这两个流并截图, 就可以看延时了,测下来延时很低(安卓后置摄像头拍摄到预览也有延时)。
相关文章:
Android14 屏幕录制(屏幕投影)和音频播放采集
Android 5开始支持屏幕采集, Android 10支持音频播放采集,不过Android 14用前台服务做屏幕录制时要增加一些处理. 1. app manifest 需要增加: <manifest><uses-permission android:name"android.permission.FOREGROUND_SERVICE" /><uses…...
一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶
一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 文章目录 前言一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 一、HKELM模型1. 极限学习机(ELM࿰…...
redis面试(十五)公平锁队列重排
队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁,没有刷新分数,就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...
python 基础语法os模块
一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径,可以是文件也可以是目录。 返回值:返回获取到的绝…...
图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。
编程要求 在图的应用中,有一个很重要的需求:我们需要知道从某一个点开始,到其他所有点的最短路径。这其中,Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码,实现 …...
河工院首届工业设计大赛程序组(挑战赛)题解
更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想: 签到题按照题意遍历字符串,不断向后寻找包含 ACMer 完整字符串的数量即可 std标程: #include <iostream> #include <cstring> #include …...
文件上传漏洞(二,靶场搭建及漏洞利用)
前言: 本文基于github上的upload-labs,PHP study以及bp抓包软件进行操作。 一,靶场搭建。 靶场链接 1,下载zip文件到PHP study下的www文件夹内,并解压。 2,创建网站。 此处php版本应选择较老版本&…...
大厂面试题分享第二期
大厂面试题分享第二期 如果执行了一条命令,"select count(*)from…",使用哪个引擎更快,为什么?垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS(并发)垃圾收集器G1垃圾回收器 HTTPS和HTTP的区别主…...
zabbix安装
a.安装 Zabbix 仓库 # rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # yum clean all b. 安装 Zabbix server、前端、agent # yum install zabbix-server-mysql zabbix-agent c. 安装Zabbix前端 启用红帽软件集合 # …...
SpringBoot集成日志框架
SpringBoot集成日志框架 Java生态体系日志框架介绍 简介 在Java生态体系中,围绕着日志,有很多成熟的解决方案。关于日志输出,主要有两类工具。 一类是日志框架(Log4j、Logback),主要用来进行日志的输出的…...
CSS笔记总结(Xmind格式):第三天
Xmind鸟瞰图: 简单文字总结: css知识: 边框线: 1.border-width:边框的粗细 2.border-style:边框线的样式(solid实线,double双实线,dotted点线,dashed虚线) 3.border-color:边框线的颜色 4.简写形式&a…...
WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo
WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时,该链接会随机选择一个关键词,并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792...
Docker Swarm 管理
Docker Swarm 是 Docker 提供的一种用于管理容器集群的工具。一、Docker Swarm 的主要特点包括: 高可用性:可以自动检测和恢复故障节点,确保服务的持续可用性。 例如,当某个工作节点出现故障时,Swarm 会将其上的任务重…...
跨平台、多格式、云同步,Koodo Reader背后的技术亮点
前言 对于像我这样的书虫来说,能够找到一个既方便又舒适的阅读环境,简直就是人生中的一大幸事;今天,就让小江湖我带你走进一个不一样的阅读世界——Koodo Reade! 无论是在喧嚣的都市,还是在宁静的乡村&a…...
【Story】如何高效记录并整理编程学习笔记?
目录 一、为何笔记在编程学习中如此重要?1.1 知识的捕捉1.2 理解和消化1.3 知识的复习1.4 知识的分享 二、建立高效的笔记系统2.1 确定笔记的目标2.2 选择合适的工具2.3 笔记的结构化2.4 记录有效的内容2.5 定期回顾和更新 三、保持笔记条理性的技巧3.1 使用一致的格…...
jenkins 安装以及自动构建maven项目并且运行
在这里找到你对应jdk的版本的jenkins包 War Jenkins Packages 我这里用的使java8,所以下载 https://mirrors.jenkins.io/war-stable/2.60.1/jenkins.war 然后jenkins可以安装到centos系统 在本地windows系统运行命令行 scp C:\Users\98090\Downloads\jenkins.war root@192…...
Java虚拟机:虚拟机介绍
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 033 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
硬件面试经典 100 题(31~40 题)CRE4
31、多级放大电路的级间耦合方式有哪几种?哪种耦合方式的电路零点偏移最严重?哪种耦合方式可以实现阻抗变换? 有三种耦合方式:直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重,变压器耦合的电路可以实现…...
ReactNative笔记(自用)
环境 ios更换gem镜像源: 查看当前源: gem sources -l 移除默认源: gem sources --remove https://rubygems.org/。添加新的源: 添加 Ruby China 的镜像源: gem source -a https://gems.ruby-china.com/或者添加其他镜像源。 清华大学的gem源: htt…...
嵌入式八股-面试30题(20240812)
TCP和UDP的区别是什么? **TCP(Transmission Control Protocol)**是面向连接的协议,提供可靠的、顺序的数据传输。它通过三次握手建立连接,并在数据传输过程中使用确认和重传机制来确保数据的正确性。TCP还支持流量控制和拥塞控制…...
用Arduino玩转GPIO中断:按键消抖+过零检测的5个实战技巧
用Arduino玩转GPIO中断:按键消抖过零检测的5个实战技巧 在智能家居和物联网设备开发中,GPIO中断的高效处理能力往往决定了整个系统的响应速度和稳定性。想象一下,当你按下智能开关却要等待半秒才有反应,或者交流电器在错误的时间点…...
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统
Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统 1. 技术招聘的痛点与AI解决方案 技术面试官每天面临重复性劳动:根据JD设计题目、评估代码、写反馈。传统方式存在三大痛点: 题库更新慢:技术栈迭代快,…...
ncmdumpGUI:实现NCM格式自由转换的音频解决方案
ncmdumpGUI:实现NCM格式自由转换的音频解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 痛点剖析:NCM格式的技术民主化阻碍 格…...
5分钟搞懂幂等矩阵:从定义到Python实现
5分钟搞懂幂等矩阵:从定义到Python实现 第一次听到"幂等矩阵"这个词时,我正坐在线性代数课的最后一排昏昏欲睡。教授在黑板上写下"AA"这个看似简单的等式时,我完全没意识到这个概念会在后来的机器学习项目中反复出现。今…...
告别虚拟机!在Windows 11上零配置搭建Masm汇编实验环境(保姆级图文教程)
在Windows 11上零配置搭建Masm汇编实验环境:从入门到实战 对于计算机专业的学生和开发者来说,汇编语言是理解计算机底层工作原理的重要工具。然而,传统的汇编环境搭建往往需要复杂的配置步骤或依赖虚拟机,这给初学者带来了不小的门…...
解决插件管理痛点:Scarab的智能高效管理方案
解决插件管理痛点:Scarab的智能高效管理方案 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾为部署一个心仪的游戏插件而耗费整个下午?好不容易…...
ncmdump终极解密攻略:5分钟实现网易云音乐NCM格式无损转换
ncmdump终极解密攻略:5分钟实现网易云音乐NCM格式无损转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为下载的网易云音乐只能在特定平台播放而烦恼?NCM格式的音乐文件像是被上了一把无形的锁&am…...
《Essential Macleod中文手册》实战指南:从入门到精通的光学薄膜设计
1. 光学薄膜设计入门:为什么选择Essential Macleod? 第一次接触光学薄膜设计时,我和大多数人一样感到无从下手。市面上有那么多仿真软件,为什么专业工程师都推荐Essential Macleod?简单来说,它就像光学薄膜…...
开发环境神器:OpenClaw+GLM-4.7-Flash自动补全错误日志解决方案
开发环境神器:OpenClawGLM-4.7-Flash自动补全错误日志解决方案 1. 为什么需要日志自动诊断系统 作为一个长期与开发环境打交道的程序员,我每天要面对数百行日志输出。最头疼的场景莫过于:当你在IDE中调试时,突然蹦出一段晦涩的错…...
