HarmonyOS 鸿蒙Next中相机双路预览有的机型黑屏

HarmonyOS 鸿蒙Next中相机双路预览有的机型黑屏

// 初始化相机。
async initCamera(): Promise<void> {
  console.info(`initCamera imageReceiverSurfaceId:${this.imageReceiverSurfaceId} xComponentSurfaceId:${this.xComponentSurfaceId}`);
  try {
    // 获取相机管理器实例。
    this.cameraManager = camera.getCameraManager(this.context);
    if (!this.cameraManager) {
      console.error('initCamera getCameraManager');
    }
    // 获取当前设备支持的相机device列表。
    this.cameras = this.cameraManager.getSupportedCameras();
    if (!this.cameras) {
      console.error('initCamera getSupportedCameras');
    }
    // 选择一个相机device,创建cameraInput输出对象。
    const frontCamera = this.cameras.find(cam => cam.cameraPosition === camera.CameraPosition.CAMERA_POSITION_FRONT);

    this.cameraInput = this.cameraManager.createCameraInput(frontCamera);
    if (!this.cameraInput) {
      console.error('initCamera createCameraInput');
    }
    // 打开相机。
    await this.cameraInput.open().catch((err: BusinessError) => {
      console.error(`initCamera open fail: ${err}`);
    })
    // 获取相机device支持的profile。
    let capability: camera.CameraOutputCapability =
      this.cameraManager.getSupportedOutputCapability(this.cameras[0], camera.SceneMode.NORMAL_VIDEO);
    if (!capability) {
      console.error('initCamera getSupportedOutputCapability');
    }
    let minRatioDiff: number = 0.1;
    let surfaceRatio: number = this.imageWidth / this.imageHeight; // 最接近16:9宽高比。
    let previewProfile: camera.Profile = capability.previewProfiles[0];
    // 应用开发者根据实际业务需求选择一个支持的预览流previewProfile。
    // 此处以选择CAMERA_FORMAT_YUV_420_SP(NV21)格式、满足限定条件分辨率的预览流previewProfile为例。
    for (let index = 0; index < capability.previewProfiles.length; index++) {
      const tempProfile = capability.previewProfiles[index];
      let tempRatio = tempProfile.size.width >= tempProfile.size.height ?
        tempProfile.size.width / tempProfile.size.height : tempProfile.size.height / tempProfile.size.width;
      let currentRatio = Math.abs(tempRatio - surfaceRatio);
      if (currentRatio <= minRatioDiff && tempProfile.format == camera.CameraFormat.CAMERA_FORMAT_YUV_420_SP) {
        previewProfile = tempProfile;
        break;
      }
    }
    this.imageWidth = previewProfile.size.width; // 更新xComponent组件的宽。
    this.imageHeight = previewProfile.size.height; // 更新xComponent组件的高。
    console.info(`initCamera imageWidth:${this.imageWidth} imageHeight:${this.imageHeight}`);
    // 使用imageReceiverSurfaceId创建第一路预览。
    this.previewOutput1 = this.cameraManager.createPreviewOutput(previewProfile, this.imageReceiverSurfaceId);
    if (!this.previewOutput1) {
      console.error('initCamera createPreviewOutput1');
    }
    // 使用xComponentSurfaceId创建第二路预览。
    this.previewOutput2 = this.cameraManager.createPreviewOutput(previewProfile, this.xComponentSurfaceId);
    if (!this.previewOutput2) {
      console.error('initCamera createPreviewOutput2');
    }
    // 创建录像模式相机会话。
    this.session = this.cameraManager.createSession(camera.SceneMode.NORMAL_VIDEO) as camera.VideoSession;
    if (!this.session) {
      console.error('initCamera createSession');
    }
    // 开始配置会话。
    this.session.beginConfig();
    // 添加相机设备输入。
    this.session.addInput(this.cameraInput);
    // 添加第一路预览流输出。
    this.session.addOutput(this.previewOutput1);
    // 添加第二路预览流输出。
    this.session.addOutput(this.previewOutput2);
    // 提交会话配置。
    await this.session.commitConfig();
    // 开始启动已配置的输入输出流。
    await this.session.start();
  } catch (error) {
    console.error(`initCamera fail: ${error}`);
  }
}

有的机型(MATE 60)可以正常显示,有的(pura x / mate70P)不行

更多关于HarmonyOS 鸿蒙Next中相机双路预览有的机型黑屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

感谢您的提问,为了更快解决您的问题,麻烦请补充以下信息:

问题现象(如:报错日志、异常截图、问题背景);

版本信息(如:开发工具、手机系统版本信息);

更多关于HarmonyOS 鸿蒙Next中相机双路预览有的机型黑屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


今天Mate 70 Pro也黑屏,死机,

鸿蒙Next中相机双路预览黑屏问题通常与设备硬件兼容性有关。部分机型可能因摄像头驱动适配或系统渲染管线差异导致预览流无法正常初始化。可检查CameraKit API调用是否符合鸿蒙Next规范,确认双路预览分辨率与帧率是否在设备支持范围内。建议查阅对应机型的Camera能力列表验证参数配置。

双路预览黑屏问题通常与设备硬件能力或surface配置相关。从代码看,你在同一会话中添加了两个预览输出,但部分机型可能不支持同时输出相同profile的多路预览。

建议检查:

  1. 确认目标机型是否支持双路预览,可通过getSupportedOutputCapability验证设备能力
  2. 尝试为两路预览使用不同的profile(如分辨率或格式),避免硬件资源冲突
  3. 确保两个surface(imageReceiverSurfaceId和xComponentSurfaceId)都已正确初始化和就绪

可在session配置前添加设备能力检查逻辑,对不支持双路预览的设备降级为单路方案。

回到顶部