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

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支持音频播放采集&#xff0c;不过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. 极限学习机&#xff08;ELM&#xff0…...

redis面试(十五)公平锁队列重排

队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁&#xff0c;没有刷新分数&#xff0c;就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...

python 基础语法os模块

一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径&#xff0c;可以是文件也可以是目录。 返回值:返回获取到的绝…...

图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。

编程要求 在图的应用中&#xff0c;有一个很重要的需求&#xff1a;我们需要知道从某一个点开始&#xff0c;到其他所有点的最短路径。这其中&#xff0c;Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码&#xff0c;实现 …...

河工院首届工业设计大赛程序组(挑战赛)题解

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想&#xff1a; 签到题按照题意遍历字符串&#xff0c;不断向后寻找包含 ACMer 完整字符串的数量即可 std标程&#xff1a; #include <iostream> #include <cstring> #include …...

文件上传漏洞(二,靶场搭建及漏洞利用)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 一&#xff0c;靶场搭建。 靶场链接 1&#xff0c;下载zip文件到PHP study下的www文件夹内&#xff0c;并解压。 2&#xff0c;创建网站。 此处php版本应选择较老版本&…...

大厂面试题分享第二期

大厂面试题分享第二期 如果执行了一条命令&#xff0c;"select count(*)from…"&#xff0c;使用哪个引擎更快&#xff0c;为什么&#xff1f;垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS&#xff08;并发&#xff09;垃圾收集器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生态体系中&#xff0c;围绕着日志&#xff0c;有很多成熟的解决方案。关于日志输出&#xff0c;主要有两类工具。 一类是日志框架&#xff08;Log4j、Logback&#xff09;&#xff0c;主要用来进行日志的输出的…...

CSS笔记总结(Xmind格式):第三天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; css知识&#xff1a; 边框线&#xff1a; 1.border-width:边框的粗细 2.border-style:边框线的样式(solid实线,double双实线,dotted点线&#xff0c;dashed虚线) 3.border-color:边框线的颜色 4.简写形式&a…...

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo

WordPress原创插件&#xff1a;Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时&#xff0c;该链接会随机选择一个关键词&#xff0c;并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792...

Docker Swarm 管理

Docker Swarm 是 Docker 提供的一种用于管理容器集群的工具。一、Docker Swarm 的主要特点包括&#xff1a; 高可用性&#xff1a;可以自动检测和恢复故障节点&#xff0c;确保服务的持续可用性。 例如&#xff0c;当某个工作节点出现故障时&#xff0c;Swarm 会将其上的任务重…...

跨平台、多格式、云同步,Koodo Reader背后的技术亮点

前言 对于像我这样的书虫来说&#xff0c;能够找到一个既方便又舒适的阅读环境&#xff0c;简直就是人生中的一大幸事&#xff1b;今天&#xff0c;就让小江湖我带你走进一个不一样的阅读世界——Koodo Reade&#xff01; 无论是在喧嚣的都市&#xff0c;还是在宁静的乡村&a…...

【Story】如何高效记录并整理编程学习笔记?

目录 一、为何笔记在编程学习中如此重要&#xff1f;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虚拟机:虚拟机介绍

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 033 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

硬件面试经典 100 题(31~40 题)CRE4

31、多级放大电路的级间耦合方式有哪几种&#xff1f;哪种耦合方式的电路零点偏移最严重&#xff1f;哪种耦合方式可以实现阻抗变换&#xff1f; 有三种耦合方式&#xff1a;直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重&#xff0c;变压器耦合的电路可以实现…...

ReactNative笔记(自用)

环境 ios更换gem镜像源&#xff1a; 查看当前源: gem sources -l 移除默认源: gem sources --remove https://rubygems.org/。添加新的源: 添加 Ruby China 的镜像源&#xff1a; gem source -a https://gems.ruby-china.com/或者添加其他镜像源。 清华大学的gem源: htt…...

嵌入式八股-面试30题(20240812)

TCP和UDP的区别是什么? **TCP&#xff08;Transmission Control Protocol&#xff09;**是面向连接的协议&#xff0c;提供可靠的、顺序的数据传输。它通过三次握手建立连接&#xff0c;并在数据传输过程中使用确认和重传机制来确保数据的正确性。TCP还支持流量控制和拥塞控制…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...