HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题

HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题

【问题现象】

为了等屏幕旋转完成后再设置视频流的宽高,在开始录制的时候进行init,但是只有首次能够初始化成功,第二次则会触发报错The operate Init failed due to not permit in current state.,最终无法改变状态。

报错内容为:

Failed to init avScreenCaptureRecorder, error: The operate Init failed due to not permit in current state.

问题代码如下:

@Component
export struct ScreenRecordWrapper {
  @State lastTime: number = 180 // 剩余时间,视频打卡默认三分钟
  @State hasStart: boolean = false
  private timer: number | null = null
  private avScreenCaptureRecorder: media.AVScreenCaptureRecorder | undefined = undefined;

  aboutToAppear(): void {
    try {
      this.createAVScreenCapture();
    } catch (exception) {
      console.error('Failed to obtain the default display object. Code: ' + JSON.stringify(exception));
    }
  }

  createAVScreenCapture() {
    media.createAVScreenCaptureRecorder().then((captureRecorder: media.AVScreenCaptureRecorder) => {
      if (captureRecorder != null) {
        this.avScreenCaptureRecorder = captureRecorder;
        // 注册监听事件
        this.avScreenCaptureRecorder.on('stateChange', (state: media.AVScreenCaptureStateCode) => {
          switch (state) {
            case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
              this.hasStart = !this.hasStart
              this.timer = setInterval(() => {
                if (this.lastTime > 0) {
                  this.lastTime = this.lastTime - 1
                } else {
                  this.stopRecord()
                }
              }, 1000)
              break;
          }
        })
      }
    })
  }

  async init() {
    if (this.avScreenCaptureRecorder !== undefined) {
      await this.avScreenCaptureRecorder.init(this.avCaptureConfig).then(() => {
        console.info('Succeeded init avScreenCaptureRecorder');
      }).catch((err: BusinessError) => {
        console.info('Failed to init avScreenCaptureRecorder, error: ' + err.message);
      })
    }
  }
}

【背景知识】

音视频录制参考链接:

【定位思路】

  1. 录制屏幕过程中通过stateChange监听用户操作,但是发现只有SCREENCAPTURE_STATE_STARTED能被startRecording触发,而stopRecording即使调用成功也不会触发任何状态改变。
  2. 由开发指南文档可知不支持停止录制后第二次设置create的对象。

【解决方案】

avScreenCaptureRecorder重新初始化后,media.createAVScreenCaptureRecorder改为同步操作,避免二次设置create对象。

修改方式如下:

async createAVScreenCapture() {
  try {
    let captureRecorder: media.AVScreenCaptureRecorder = await media.createAVScreenCaptureRecorder();
    if (captureRecorder != null) {
      this.avScreenCaptureRecorder = captureRecorder;
      // 注册监听事件
      this.avScreenCaptureRecorder.on('stateChange', (state: media.AVScreenCaptureStateCode) => {
        switch (state) {
          case media.AVScreenCaptureStateCode.SCREENCAPTURE_STATE_STARTED:
            this.hasStart = !this.hasStart
            this.timer = setInterval(() => {
              if (this.lastTime > 0) {
                this.lastTime = this.lastTime - 1
              } else {
                this.stopRecord()
              }
            }, 1000)
            break;
        }
      })
    }
  } catch (error) {
    console.log(error);
  }
}

【总结】

avScreenCaptureRecorder不支持停止后第二次设置create的对象,需要重新初始化并将createAVScreenCaptureRecorder改为同步操作。


更多关于HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决屏幕停止录制后,无法开始第二次录制的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,屏幕停止录制后无法开始第二次录制的问题

在HarmonyOS鸿蒙Next中,屏幕停止录制后无法开始第二次录制的问题,通常与系统资源释放或录制状态未正确重置有关。

首先,确保在第一次录制结束后,调用stopScreenRecording()方法,并监听onStop()回调,确保录制资源已完全释放。

其次,检查是否在录制结束后未正确重置录制状态,导致系统认为录制仍在进行中。可以通过调用resetScreenRecording()方法或重新初始化录制模块来重置状态。

此外,检查是否有其他应用或系统进程占用了录制资源,导致无法启动第二次录制。可以通过日志或调试工具排查资源占用情况。

如果问题仍未解决,建议检查系统版本是否为最新,并确认是否存在已知的录制相关Bug。

回到顶部