鸿蒙5.0版开发:视频播放和录制-使用AVScreenCaptureRecorder录屏保存到文 ...

打印 上一主题 下一主题

主题 1621|帖子 1621|积分 4863

 往期鸿蒙全套实战文章必看:



  • 鸿蒙开发核心知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开发实战学习门路
  • 鸿蒙HarmonyOS NEXT开发技能最全学习门路指南
  • 鸿蒙应用开发实战项目,看这一篇文章就够了(部门项目附源码)

使用AVScreenCaptureRecorder录屏保存到文件(ArkTS)

屏幕录制主要为主屏幕录屏功能。
开发者可以调用录屏(AVScreenCaptureRecorder)模块的ArkTs接口,完成屏幕录制,采集设备内、麦克风等的音视频源数据。可以调用录屏模块获取音视频文件,然后通过文件的情势流转到其他模块进行播放或处理,达成文件情势分享屏幕内容的场景。
录屏模块和窗口(Window)、图形(Graphic)等模块协同完成整个视频采集的流程。
使用AVScreenCaptureRecorder录制屏幕涉及到AVScreenCaptureRecorder实例的创建、音视频采集参数的设置、采集的开始与克制、资源的开释等。
开始屏幕录制时正在通话中大概屏幕录制过程中来电,录屏将主动克制。因通话中断的录屏会上报SCREENCAPTURE_STATE_STOPPED_BY_CALL状态。
开发指导将以完成一次屏幕数据录制的过程为例,向开发者讲解如何使用
假如设置了采集麦克风音频数据,需对应设置麦克风权限ohos.permission.MICROPHONE和申请长时任务。
申请权限

开发此功能前,开发者应根据实际需求申请相应权限。
权限名说明授权方式权限级别ohos.permission.MICROPHONE允许应用使用麦克风(可选)。user_grantnormalohos.permission.READ_IMAGEVIDEO允许应用读取用户外部存储中的媒体文件信息。user_grantnormalohos.permission.WRITE_IMAGEVIDEO允许应用读写用户外部存储中的媒体文件信息。user_grantnormal 开发步调及注意事项

使用AVScreenCaptureRecorder时要明确其状态的变化,在创建实例后,调用对应的方法可以进入指定的状态实现对应的行为。在确定的状态下执行不合适的方法会导致AVScreenCaptureRecorder发生错误,开发者必要在调用状态转换的方法前进行状态查抄,克制程序运行异常。

  • 添加头文件。
    1. import media from '@ohos.multimedia.media';
    复制代码
  • 创建AVScreenCaptureRecorder类型的成员变量screenCapture。
    1. // 声明一个AVScreenCaptureRecorder类型的变量
    2. private screenCapture?: media.AVScreenCaptureRecorder;
    3. // 创建一个AVScreenCaptureRecorder,并赋值给screenCapture成员变量
    4. this.screenCapture = await media.createAVScreenCaptureRecorder();
    复制代码
  • 对成员变量screenCapture设置监听函数,分别监听差别状态和异常情况。
    1. this.screenCapture.on('stateChange', async (infoType: media.AVScreenCaptureStateCode) => {
    2.     switch (infoType) {
    3.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
    4.               console.info("录屏成功开始后会收到的回调");
    5.               break;
    6.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_CANCELED:
    7.             this.screenCapture?.release();
    8.             this.screenCapture = undefined;
    9.               console.info("不允许使用录屏功能");
    10.               break;
    11.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER:
    12.             this.screenCapture?.release();
    13.             this.screenCapture = undefined;
    14.               console.info("通过录屏胶囊结束录屏,底层录制会停止");
    15.               break;
    16.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_INTERRUPTED_BY_OTHER:
    17.             console.info("录屏因其他中断而停止,底层录制会停止");
    18.             break;
    19.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_CALL:
    20.             console.info("录屏过程因通话中断,底层录制会停止");
    21.             break;
    22.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNAVAILABLE:
    23.             console.info("录屏麦克风不可用");
    24.             break;
    25.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_MUTED_BY_USER:
    26.             console.info("录屏麦克风被用户静音");
    27.             break;
    28.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNMUTED_BY_USER:
    29.             console.info("录屏麦克风被用户取消静音");
    30.             break;
    31.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_ENTER_PRIVATE_SCENE:
    32.             // 目前可以从系统直接注册监听到进入隐私场景
    33.             console.info("录屏进入隐私场景");
    34.             break;
    35.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_EXIT_PRIVATE_SCENE:
    36.             console.info("录屏退出隐私场景");
    37.             break;
    38.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER_SWITCHES:
    39.             console.info("用户账号切换,底层录制会停止");
    40.             break;
    41.         default:
    42.               break;
    43.     }
    44. })
    45. this.screenCapture.on('error', (err) => {
    46.     console.info("处理异常情况");
    47. })
    复制代码
  • 设置屏幕录制参数。
    ​ 创建AVScreenCaptureRecorder实例screenCapture后,可以设置屏幕录制所必要的参数。
    ​ 参数videoBitrate、audioSampleRate、audioChannelCount、audioBitrate、preset为可选参数,若不设置则可按默认值进行设置,如下示例中提供了可选参数的默认值。麦克风和系统音的音频流共用一套音频参数,分别是音频采样率、音频通道数和音频比特率,对应audioSampleRate、audioChannelCount和audioBitrate参数。
    1. captureConfig: media.AVScreenCaptureRecordConfig = {
    2.     // 开发者可以根据自身的需要设置宽高
    3.     frameWidth: 768,
    4.     frameHeight: 1280,
    5.     // 参考应用文件访问与管理开发示例新建并读写一个文件fd
    6.     fd: 0,
    7.     // 可选参数及其默认值
    8.     videoBitrate: 10000000,
    9.     audioSampleRate: 48000,
    10.     audioChannelCount: 2,
    11.     audioBitrate: 96000,
    12.     preset: media.AVScreenCaptureRecordPreset.SCREEN_RECORD_PRESET_H264_AAC_MP4
    13. }
    复制代码
  • 基于预先设置的屏幕录制参数,调用init()方法初始化screenCapture。
    1. await this.screenCapture.init(this.captureConfig);
    复制代码
  • 创建豁免隐私窗口,这里填写的是子窗口id和主窗口id
    1. let windowIDs = [57, 86];
    2. await screenCapture.skipPrivacyMode(windowIDs);
    复制代码
  • 调用startRecording()方法开始进行屏幕录制,并通过监听函数监听状态。
    1. await this.screenCapture.startRecording();
    复制代码
  • 克制录屏。

    • 点击录屏胶囊中的竣事按钮克制录制:基于回调函数实现,录屏对象实例screenCapture会触发SCREENCAPTURE_STATE_STOPPED_BY_USER的回调,通知应用此次录屏已克制,不必要开发者主动调用stopRecording()方法。
    • 应用主动调用stopRecording()方法,克制录屏。
      1. await this.screenCapture.stopRecording();
      复制代码

  • 调用release()方法烧毁实例,开释资源。
    1. await this.screenCapture.release();
    复制代码
完整示例

下面展示了使用AVScreenCaptureRecorder屏幕录屏存文件的完整示例代码。
  1. import media from '@ohos.multimedia.media';
  2. export class AVScreenCaptureDemo {
  3.   private screenCapture?: media.AVScreenCaptureRecorder;
  4.   captureConfig: media.AVScreenCaptureRecordConfig = {
  5.     // 开发者可以根据自身的需要设置宽高
  6.     frameWidth: 768,
  7.     frameHeight: 1280,
  8.     // 参考应用文件访问与管理开发示例新建并读写一个文件fd
  9.     fd: 0,
  10.     // 可选参数及其默认值
  11.     videoBitrate: 10000000,
  12.     audioSampleRate: 48000,
  13.     audioChannelCount: 2,
  14.     audioBitrate: 96000,
  15.     preset: media.AVScreenCaptureRecordPreset.SCREEN_RECORD_PRESET_H264_AAC_MP4
  16.   };
  17.    
  18.   // 调用startRecording方法可以开始一次录屏存文件的流程,结束录屏可以通过点击录屏胶囊停止按钮进行操作。
  19.   public async startRecording() {
  20.     this.screenCapture = await media.createAVScreenCaptureRecorder();
  21.     if (this.screenCapture != undefined) {
  22.       // success
  23.     } else {
  24.       // failed
  25.         return;
  26.     }
  27.     this.screenCapture?.on('stateChange', async (infoType: media.AVScreenCaptureStateCode) => {
  28.       switch (infoType) {
  29.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
  30.           console.info("录屏成功开始后会收到的回调");
  31.           break;
  32.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_CANCELED:
  33.           this.screenCapture?.release();
  34.           this.screenCapture = undefined;
  35.           console.info("不允许使用录屏功能");
  36.           break;
  37.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER:
  38.           this.screenCapture?.release();
  39.           this.screenCapture = undefined;
  40.           console.info("通过录屏胶囊结束录屏,底层录制会停止");
  41.           break;
  42.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_INTERRUPTED_BY_OTHER:
  43.           console.info("录屏因其他中断而停止,底层录制会停止");
  44.           break;
  45.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_CALL:
  46.           console.info("录屏过程因通话中断,底层录制会停止");
  47.           break;
  48.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNAVAILABLE:
  49.           console.info("录屏麦克风不可用");
  50.           break;
  51.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_MUTED_BY_USER:
  52.           console.info("录屏麦克风被用户静音");
  53.           break;
  54.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_MIC_UNMUTED_BY_USER:
  55.           console.info("录屏麦克风被用户取消静音");
  56.           break;
  57.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_ENTER_PRIVATE_SCENE:
  58.           // 目前可以从系统直接注册监听到进入隐私场景
  59.           console.info("录屏进入隐私场景");
  60.           break;
  61.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_EXIT_PRIVATE_SCENE:
  62.           console.info("录屏退出隐私场景");
  63.           break;
  64.         case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER_SWITCHES:
  65.           console.info("用户账号切换,底层录制会停止");
  66.           break;
  67.         default:
  68.           break;
  69.       }
  70.     })
  71.     this.screenCapture?.on('error', (err) => {
  72.       console.info("处理异常情况");
  73.     })
  74.     await this.screenCapture?.init(this.captureConfig);
  75.    
  76.     // 豁免隐私窗口
  77.     let windowIDs = [57, 86];
  78.     await this.screenCapture?.skipPrivacyMode(windowIDs);
  79.    
  80.     await this.screenCapture?.startRecording();
  81.   }
  82.   // 可以主动调用stopRecording方法来停止录屏。
  83.   public async stopRecording() {
  84.     if (this.screenCapture == undefined) {
  85.       // Error
  86.       return;
  87.     }
  88.     await this.screenCapture?.stopRecording();
  89.    
  90.     // 调用release()方法销毁实例,释放资源。
  91.     await this.screenCapture?.release();
  92.     // 最后需要关闭创建的录屏文件fd, fs.close(fd);
  93.   }
  94. }
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表