OpenHarmony AVScreenCaptureRecorder录屏开发指导

一、简介

OpenHarmony 5.0新增了AVScreenCaptureRecorder ArkTs API。用户可以调用录屏AVScreenCaptureRecorder API录制屏幕,采集音频源数据,获取封装后的音视频文件,然后通过文件的形式流转到其他模块进行播放或处理,用于以文件形式分享屏幕内容的场景。

二、框架图

在这里插入图片描述
屏幕录制:应用通过AVScreenCapture ArkTs接口实现屏幕录制功能时,框架层会通过录屏框架,调用图形服务捕获屏幕视频数据,调用音频服务捕获音频数据,通过媒体录制服务将音视频数据编码封装后保存至文件中,实现屏幕录制功能。

三、版本信息

OpenHarmony-v5.0.1-Release 标准系统。AVScreenCaptureRecorder ArkTs API从API version 12开始支持。

四、API参考

详细的API参考可查看 AVScreenCaptureRecorder API

  // 创建屏幕录制实例createAVScreenCaptureRecorder(): Promise<AVScreenCaptureRecorder>// 设置录屏参数,异步方式进行录屏初始化init(config: AVScreenCaptureRecordConfig): Promise<void>// 异步方式开始录屏startRecording(): Promise<void>// 异步方式结束录屏stopRecording(): Promise<void>// 录屏时,应用可对本应用的隐私窗口做安全豁免。如录屏时,用户在本应用进行输入密码等操作,应用不  会进行黑屏处理skipPrivacyMode(windowIDs: Array<number>): Promise<void>// 异步方式设置麦克风开关setMicEnabled(enable: boolean): Promise<void>// 异步方式释放录屏实例release(): Promise<void>// 订阅录屏状态切换的事件,当状态发生的时候,会通过订阅的回调通知用户on(type: 'stateChange', callback: Callback<AVScreenCaptureStateCode>): void// 订阅AVScreenCaptureRecorder的错误事件,用户可以根据应用自身逻辑对错误事件进行处理on(type: 'error', callback: ErrorCallback): voidinterface AVScreenCaptureRecordConfig {fd: number;                            // 录制输出的文件fd,必需参数frameWidth?: number;                   //录屏的视频宽度,默认屏幕宽度,非必需参数frameHeight?: number;videoBitrate?: number;audioSampleRate?: number;audioChannelCount?: number;audioBitrate?: number;preset?: AVScreenCaptureRecordPreset;  // 录屏使用的编码和封装格式,非必需参数}enum AVScreenCaptureRecordPreset { SCREEN_RECORD_PRESET_H264_AAC_MP4 = 0,SCREEN_RECORD_PRESET_H265_AAC_MP4 = 1,}// 屏幕录制的状态回调enum AVScreenCaptureStateCode {SCREENCAPTURE_STATE_STARTED = 0,                   // 录屏已开始SCREENCAPTURE_STATE_CANCELED = 1,                  // 录屏被取消SCREENCAPTURE_STATE_STOPPED_BY_USER = 2,           // 录屏被用户手动停止SCREENCAPTURE_STATE_INTERRUPTED_BY_OTHER = 3,      // 录屏被其他录屏打断SCREENCAPTURE_STATE_STOPPED_BY_CALL = 4,           // 录屏被来电打断SCREENCAPTURE_STATE_MIC_UNAVAILABLE = 5,           // 录屏无法使用麦克风录音SCREENCAPTURE_STATE_MIC_MUTED_BY_USER = 6,         // 麦克风被用户关闭SCREENCAPTURE_STATE_MIC_UNMUTED_BY_USER = 7,       // 麦克风被用户打开SCREENCAPTURE_STATE_ENTER_PRIVATE_SCENE = 8,       // 录屏进入隐私页面SCREENCAPTURE_STATE_EXIT_PRIVATE_SCENE = 9,        // 录屏退出隐私页面SCREENCAPTURE_STATE_STOPPED_BY_USER_SWITCHES = 10, //系统用户切换,录屏中断}

五、开发步骤

1、导入头文件

import media from '@ohos.multimedia.media';

2、创建一个AVScreenCaptureRecorder类型的成员变量

// 声明一个AVScreenCaptureRecorder类型的变量
private screenCapture?: media.AVScreenCaptureRecorder;
// 创建一个AVScreenCaptureRecorder实例
this.screenCapture = await media.createAVScreenCaptureRecorder();

3、对录屏实例设置状态切换监听函数,可监听录屏不同状态和异常情况

  this.screenCapture.on('stateChange', async (infoType: media.AVScreenCaptureStateCode) => {switch (infoType) {case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:console.info("开始录屏成功后收到的回调");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_CANCELED:this.screenCapture?.release();this.screenCapture = undefined;break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER:this.screenCapture?.release();this.screenCapture = undefined;break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_INTERRUPTED_BY_OTHER:console.info("录屏因其他中断而停止,底层录制已停止");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_CALL:console.info("录屏过程因通话中断,底层录制已停止");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNAVAILABLE:console.info("录屏麦克风不可用");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_MUTED_BY_USER:console.info("录屏麦克风被用户静音");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNMUTED_BY_USER:console.info("录屏麦克风被用户取消静音");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_ENTER_PRIVATE_SCENE:console.info("录屏进入隐私场景");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_EXIT_PRIVATE_SCENE:console.info("录屏退出隐私场景");break;case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER_SWITCHES:console.info("用户账号切换,底层录制已停止");break;default:break;}})this.screenCapture.on('error', (err) => {console.info("异常情况处理");})

4、配置屏幕录制参数。

​创建AVScreenCaptureRecorder实例后,可以设置屏幕录制所需要的参数

​参数videoBitrate、audioSampleRate、audioChannelCount、audioBitrate、preset都是可选参数,若不设置则可按默认值进行设置。

  captureConfig: media.AVScreenCaptureRecordConfig = {// 用户可以根据需求设置录屏宽高frameWidth: 1920,frameHeight: 1080,// 新建文件fdfd: xx,// 可选参数的默认值videoBitrate: 10000000,audioSampleRate: 48000,audioChannelCount: 2,audioBitrate: 96000,preset: media.AVScreenCaptureRecordPreset.SCREEN_RECORD_PRESET_H264_AAC_MP4};

5、基于预先配置的屏幕录制参数,调用init()方法初始化录屏实例

await this.screenCapture.init(this.captureConfig);

6、创建豁免隐私窗口,这里填写子窗口id和主窗口id,具体开发步骤可参见窗口API

let windowIDs = [xxx, xxx];
await screenCapture.skipPrivacyMode(windowIDs);

7、调用startRecording()方法开始进行屏幕录制,并通过监听函数监听状态。

await this.screenCapture.startRecording();

8、停止录屏
(1)点击录屏胶囊中的结束按钮停止录制:基于回调函数实现,录屏实例会触发SCREENCAPTURE_STATE_STOPPED_BY_USER的回调,通知应用此次录屏已停止,不需要应用主动调用stopRecording()方法。
(2)应用主动调用stopRecording()方法,停止录屏

await this.screenCapture.stopRecording();

9、调用release()方法销毁实例,释放资源。

await this.screenCapture.release();

六、注意事项

1、目前AVScreenCaptureRecorder ArkTs API功能是受限的,用户若想实现更丰富的录屏功能可以调用Native API,比如获取录屏码流数据、选择音频源等;
2、开始屏幕录制时正在通话中或者屏幕录制过程中来电,录屏将自动停止;因通话中断的录屏会上报SCREENCAPTURE_STATE_STOPPED_BY_CALL状态;
3、如果配置了采集麦克风音频数据,需对应配置麦克风权限ohos.permission.MICROPHONE和申请长时任务;
4、音频默认录制的是系统音和麦克风的混合声音,内录的系统音和外录的麦克风共用用户配置的音频参数;
5、录屏的音频采样率默认是48000Hz,仅支持设置48000或16000;
6、录屏的音频通道数,默认2声道,仅支持设置1或2声道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/67727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】构造方法注入 属性加final

在Spring框架中&#xff0c;构造方法注入是一种常见的依赖注入方式。通过构造方法注入&#xff0c;Spring容器会在创建Bean时自动调用相应的构造方法&#xff0c;并将所需的依赖作为参数传入。关于构造方法注入时属性是否加final关键字&#xff0c;主要有以下几点区别&#xff…

windows C#-泛型接口

为泛型集合类或表示集合中的项的泛型类定义接口通常很有用处。 为避免对值类型执行装箱和取消装箱操作&#xff0c;最好对泛型类使用泛型接口&#xff0c;例如 IComparable<T>。 .NET 类库定义多个泛型接口&#xff0c;以便用于 System.Collections.Generic 命名空间中的…

ios脚本巨魔商店多巴胺越狱基本操作教程

准备工作 确认设备兼容性&#xff1a;A9-A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1&#xff1b;A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xff09;&#xff1a;iOS15.0-16.5.1&#xff1b;A15-A16&#xff08;iPhone13&#xff0d…

一.MySQL程序简介

整体介绍 1.服务端mysqld(可执行文件) mysqld --verbose --help 2.客户端mysql(可执行文件) 3.其它工具包程序

算法练习03

一、题目 给你两个字符串 haystack和 needle&#xff0c;请你在haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是 haystack 的一部分&#xff0c;则返回-1。 示例 1:输入:haystack"sadbutsad",needle "sad"。输出…

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC&#xff0c;例如下图&#xff1a;因为内存分配失败&#xff08;Allocation Failure&#xff09;导致 如果不出现FullGC的字样说明它不是FUllGC&#xff0c;并不像Serial GC、ParallelGC的在老年代…

Hadoop常见面试题

题目摘录于博客https://blog.csdn.net/qq_42397330/article/details/130218083 1. HDFS的架构 HDFS采用主从架构&#xff0c;其中有两个重要节点Name Node和Data Node&#xff0c;前者负责管理节点以及命名空间和客户端的请求&#xff0c;后者是实际存储数据的节点&#xff0c;…

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…

【Duilib】 List控件支持多选和获取选择的多条数据

问题 使用Duilib库写的一个UI页面用到了List控件&#xff0c;功能变动想支持选择多行数据。 分析 1、List控件本身支持使用SetMultiSelect接口设置是否多选&#xff1a; void SetMultiSelect(bool bMultiSel);2、List控件本身支持使用GetNextSelItem接口获取选中的下一个索引…

腾讯云AI代码助手编程挑战赛-武器大师

作品简介 对话过程能够介绍二战 各种武器 冷战 武器 现代的 各种武器装备&#xff0c;陆海空三军都知道。 技术架构 使用全后端分离的架构&#xff0c;前端使用Vue脚手架&#xff0c;腾讯云修改样式css 开发环境、开发流程 系统&#xff1a;win11 开发工具&#xff1a;VS…

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…

Golang的文件加密技术研究与应用

Golang的文件加密技术研究与应用 一、加密技术概述 文件加密的重要性 文件加密是指通过对文件进行加密操作&#xff0c;将文件内容转化为一段难以理解的数据。这样可以保护文件的隐私和安全&#xff0c;防止文件被未授权的用户访问和窃取。在日常工作和生活中&#xff0c;我们经…

3. ML机器学习

1.人工智能与机器学习的关系 机器学习是人工智能的一个重要分支&#xff0c;是人工智能的一个子集。它无需显式编程&#xff0c;而是通过数据和算法使机器能够自动学习和改进&#xff0c;从而实现智能行为。机器学习依赖于算法来识别数据中的模式&#xff0c;并通过这些模式做出…

Redis之秒杀活动

目录 全局唯一ID&#xff1a; 为什么 count 不可能为 null&#xff1f; 为什么返回值是 timestamp << COUNT_BITS | count&#xff1f; 整体的逻辑 (1) 生成时间戳 (2) 生成序列号 (3) 拼接时间戳和序列号 超卖问题&#xff1a; 基于版本号的乐观锁 CAS思想 …

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

如何解决 /proc/sys/net/bridge/bridge-nf-call-iptables 文件缺失的问题

在使用 Linux 系统&#xff0c;尤其是在容器化环境&#xff08;如 Docker、Kubernetes&#xff09;中时&#xff0c;我们可能会遇到如下错误信息&#xff1a; [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptabl…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

《软硬协同优化,解锁鸿蒙系统AI应用性能新高度》

在当今数字化时代&#xff0c;鸿蒙系统与人工智能的融合正逐渐成为科技领域的热门话题。如何通过软件和硬件协同优化&#xff0c;进一步提升鸿蒙系统中AI应用的整体性能&#xff0c;成为了开发者和技术爱好者们关注的焦点。 鸿蒙系统与AI应用的融合现状 鸿蒙系统以其独特的微…

STM32 单片机 练习项目 LED灯闪烁LED流水灯蜂鸣器 未完待续

个人学习笔记 文件路径&#xff1a;程序源码\STM32Project-DAP&DAPmini\1-1 接线图 3-1LED闪烁图片 新建项目 新建项目文件 选择F103C8芯片 关闭弹出窗口 拷贝资料 在项目内新建3个文件夹 Start、Library、User Start文件拷贝 从资料中拷贝文件 文件路径&#xff1a;固…

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中&#xff0c;参数和变量是两个关键概念&#xff0c;它们分别指代不同类型的数据和设置。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是指在训练过程中学习到的模型内部变量&#xff0c;这些变量…