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): void

  interface 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,
    // 新建文件fd
    fd: 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声道。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS Grid 布局示例(基本布局+代码属性描述)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS Grid 布局示例</title><style>.gri…

爬虫学习案例3

爬取美女图片 优美图库地址 一页图片 安装依赖库文件 pip install selenium requests beautifulsoup4import time import requests import random from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service fr…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE&#xff0c;对应的tomcat版本为9.0.41&#xff0c;公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应&#xff0c;从而可能导致获取其他用户先前请求的数据&#xff0c;造…

http源码分析

一、HttpURLConnection http连接池源码分析 二、HttpClient 连接池&#xff0c;每个路由最大连接数 三、OkHttp okhttp的连接池与socket连接

阿里云DDoS防护:如何更换IP地址,保护您的云服务器

随着网络攻击日益增多&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击已经成为对企业和个人云资源的一大威胁。为了帮助用户抵御这类攻击&#xff0c;阿里云推出了强大的DDoS防护服务&#xff0c;保障您的云服务器免受恶意流量的影响。今天&#xff0c;九河云就来…

[sdx12] Qualcomm SDX12查看基线版本

about.html文件 Build部分 Product SDX12.LE.1.0-00263-NBOOT.NEFS.PROD-1.90789.1 Distribution SDX12.LE.1.0|AMSS|Standard|OEM: Build Components部分 从以上截图可以看到以下模块的版本号及格式 BOOT 基线版本号 BOOT.BF.3.1.c3-00010-SDX12AAAAANAZB-1 Distr…

Qt天气预报系统界面关闭

Qt天气预报系统界面关闭 1、点击右上角x退出1.1添加控件1.2修改控件名字1.3编程实现控件功能 2、鼠标右键退出2.1重写鼠标点击事件2.2添加定义2.3添加一个菜单2.3.1创建一个菜单指针2.3.2创建一个菜单对象2.3.3显示菜单2.3.4定义一个菜单退出动作2.3.5在当前鼠标位置显示菜单2.…

vue2实现excel文件预览

一、插件 通过xlsx插件解析excel数据&#xff0c;对解析后的html组件进行渲染展示。 npm install xlsx 二、完整代码 <template><!-- excel文件预览 --><divelement-loading-text"拼命加载中"element-loading-spinner"el-icon-loading"…

【简博士统计学习方法】2. 统计学习方法的基本分类

2. 统计学习方法的基本分类 监督学习所学习的数据都是已经标注过的&#xff1b;无监督学习所学习的数据没有标注信息&#xff1b;半监督学习只含有少量标注&#xff0c;大多数没有标注&#xff08;利用已标注的数据来学习去标注未标注的数据&#xff09; 2.1 监督学习 图里的…

【Python爬虫实战】从基础概念到HTTP/HTTPS协议全面解析

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、爬虫的关键概念 &#xff08;一&#xff09;HTTP请求与响应 &#xff0…

Git命令行的使用

目录 一、什么是Git 1、本地仓库 vs 远端仓库 本地仓库 远端仓库 2、.git vs .gitignore .git .gitignore 二、使用Git命令 1、安装git 2、git首次使用需要配置用户邮箱和用户名 3、上传目录/文件到远端仓库步骤 1&#xff09;创建放置文件的目录 2&#xff09;cd…

Genome Research | 俄亥俄州立于忠堂组-结合深度学习与蛋白质数据库系统探究反刍动物真核微生物...

结合深度学习与蛋白质数据库系统探究反刍动物真核微生物 Probing the eukaryotic microbes of ruminants with a deep-learning classifier and comprehensive protein databases 期刊&#xff1a;Genome Research DOI&#xff1a;https://doi.org/10.1101/gr.279825.124 第一作…

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…

UE5中实现右键开镜效果

右键之后添加时间轴&#xff0c;然后设置视野即可。Set Field Of View 时间轴设置&#xff0c;第一个点设置0,90度&#xff0c;因为默认的就是90度 第二个点看武器的类型或者倍境来设置&#xff0c;时间就是开镜时间&#xff0c;值越小开镜速度越快&#xff0c;第二个值就是视野…

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库&#xff0c;他可以方便地记录应用程序的运行状态&#xff0c;并提供多种输出格式。官网&#xff1a;https://github.com/gabime/spdlog 安装教程可以参考&#xff1a;https://blog.csdn.net/Harrytsz/article/details/144887297 S…

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的&#xff0c;ISO/IEC是付费的&#xff0c;所以我们主要阅读ITU提供的官方文档&#xff0c;比如较新…

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)

前言 继3年前设计的&#xff1a;Multisim&#xff1a;振幅调制器的设计&#xff08;含仿真程序文档原理图PCB&#xff09;&#xff0c;有读者表示已经不能满足新需求&#xff0c;需要加上新的解调器功能&#x1f602;&#x1f602;&#x1f602;&#xff0c;鸽了很久这里便安排…

BGP(Border Gateway Protocol)路由收集器

全球 BGP&#xff08;边界网关协议&#xff09;路由收集器的分布情况以及相关数据。以下是主要的信息解读&#xff1a; 地图标记&#xff1a; 每个绿色点代表一个路由收集器的位置。路由收集器分布在全球不同的地区&#xff0c;覆盖了五大区域&#xff1a; ARIN&#xff08;美…

【Rust自学】10.5. 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.5.1. 什么是生命周期 Rust的每个引用都有自己的生命周期&#xff0c;生命周期的作用是让引用保持有效&#xff0c;也可以说它是保持引…