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
应该是模拟器不支持录屏
更多关于HarmonyOS鸿蒙Next中AVScreenCaptureRecorde录屏报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,AVScreenCaptureRecorder录屏报错可能由以下原因导致:
- 权限未配置:确保在config.json中声明ohos.permission.CAPTURE_SCREEN权限
- 参数设置错误:检查输出格式(FORMAT_MP4等)、分辨率等参数是否在设备支持范围内
- 资源冲突:其他应用可能占用录屏资源
- 生命周期问题:在Page的onPageShow后初始化,onPageHide前释放
- 设备限制:部分机型可能不支持特定录屏参数
典型错误代码:
- 201:权限不足
- 5400103:参数错误
- 5400105:资源占用,
从代码来看,AVScreenCaptureRecorder录屏报错可能有以下几个原因:
-
文件权限问题:代码中使用的是
/data/storage/el2/base/files
路径,需要确保应用有该目录的读写权限。建议检查应用的权限配置。 -
隐私窗口豁免问题:代码中硬编码了windowIDs=[57,86],这些窗口ID可能不存在或无效,导致初始化失败。建议动态获取需要豁免的窗口ID。
-
配置参数问题:
- frameWidth/frameHeight设置可能超出设备支持范围
- fd文件描述符可能无效
- 音频/视频参数可能不兼容
-
生命周期管理问题:没有正确处理on(‘error’)回调,建议在error回调中添加详细错误日志输出。
-
未正确处理异步操作:多处await调用缺少错误捕获,建议添加try-catch块。
建议先检查error回调中的具体错误信息,这能帮助快速定位问题根源。同时确保设备系统版本支持AVScreenCaptureRecorder功能。