HarmonyOS鸿蒙Next中AVScreenCaptureRecorde录屏报错

HarmonyOS鸿蒙Next中AVScreenCaptureRecorde录屏报错

export class AVScreenCapture {
  private screenCapture?: media.AVScreenCaptureRecorder;
  captureConfig: media.AVScreenCaptureRecordConfig = {
    // 开发者可以根据自身的需要设置宽高。
    frameWidth: 768,
    frameHeight: 1280,
    // 参考应用文件访问与管理开发示例新建并读写一个文件fd。
    fd: this.getFileFd(),
    // 可选参数及其默认值。
    videoBitrate: 10000000,
    audioSampleRate: 48000,
    audioChannelCount: 2,
    audioBitrate: 96000,
    displayId: 0,
    preset: media.AVScreenCaptureRecordPreset.SCREEN_RECORD_PRESET_H264_AAC_MP4
  };

  public getFileFd(): number {
    let filesDir = '/data/storage/el2/base/files';
    let file = fs.openSync(filesDir +'/screen.mp4', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    return file.fd;
  }

  // 调用startRecording方法可以开始一次录屏存文件的流程,结束录屏可以通过点击录屏胶囊停止按钮进行操作。
  public async startRecording() {
    this.screenCapture = await media.createAVScreenCaptureRecorder();
    if (this.screenCapture != undefined) {
      // success.
    } else {
      // failed.
      return;
    }
    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;
          console.info("不允许使用录屏功能");
          break;
        case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STOPPED_BY_USER:
          this.screenCapture?.release();
          this.screenCapture = undefined;
          console.info("通过录屏胶囊结束录屏,底层录制会停止");
          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("处理异常情况"+err);
    })
    await this.screenCapture?.init(this.captureConfig);

    // 豁免隐私窗口。
    let windowIDs = [57, 86];
    await this.screenCapture?.skipPrivacyMode(windowIDs);

    await this.screenCapture?.startRecording();
  }

  // 可以主动调用stopRecording方法来停止录屏。
  public async stopRecording() {
    if (this.screenCapture == undefined) {
      // Error.
      return;
    }
    await this.screenCapture?.stopRecording();

    // 调用release()方法销毁实例,释放资源。
    await this.screenCapture?.release();
    promptAction.showToast({message:'暂停成功'})

    // 最后需要关闭创建的录屏文件fd, fs.close(fd);
  }
}

更多关于HarmonyOS鸿蒙Next中AVScreenCaptureRecorde录屏报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

应该是模拟器不支持录屏

更多关于HarmonyOS鸿蒙Next中AVScreenCaptureRecorde录屏报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,AVScreenCaptureRecorder录屏报错可能由以下原因导致:

  1. 权限未配置:确保在config.json中声明ohos.permission.CAPTURE_SCREEN权限
  2. 参数设置错误:检查输出格式(FORMAT_MP4等)、分辨率等参数是否在设备支持范围内
  3. 资源冲突:其他应用可能占用录屏资源
  4. 生命周期问题:在Page的onPageShow后初始化,onPageHide前释放
  5. 设备限制:部分机型可能不支持特定录屏参数

典型错误代码:

  • 201:权限不足
  • 5400103:参数错误
  • 5400105:资源占用,

从代码来看,AVScreenCaptureRecorder录屏报错可能有以下几个原因:

  1. 文件权限问题:代码中使用的是/data/storage/el2/base/files路径,需要确保应用有该目录的读写权限。建议检查应用的权限配置。

  2. 隐私窗口豁免问题:代码中硬编码了windowIDs=[57,86],这些窗口ID可能不存在或无效,导致初始化失败。建议动态获取需要豁免的窗口ID。

  3. 配置参数问题:

    • frameWidth/frameHeight设置可能超出设备支持范围
    • fd文件描述符可能无效
    • 音频/视频参数可能不兼容
  4. 生命周期管理问题:没有正确处理on(‘error’)回调,建议在error回调中添加详细错误日志输出。

  5. 未正确处理异步操作:多处await调用缺少错误捕获,建议添加try-catch块。

建议先检查error回调中的具体错误信息,这能帮助快速定位问题根源。同时确保设备系统版本支持AVScreenCaptureRecorder功能。

回到顶部