HarmonyOS鸿蒙Next中flutter下不支持CameraController的startImageStream方法不支持获取摄像头实时影响流

HarmonyOS鸿蒙Next中flutter下不支持CameraController的startImageStream方法不支持获取摄像头实时影响流 问题:flutter下不支持CameraController的startImageStream方法不支持获取摄像头实时影响流,使用的是https://gitcode.com/openharmony-tpc/flutter_packages.git

场景:目前应用用来做实时摄像头心率测量,需要获取实时每一帧的图像流。后面还需要摄像头实时识别跳绳等功能,这些都需要通过获取实时影响流来实现。目前安卓,小程序是支持这个功能的。


更多关于HarmonyOS鸿蒙Next中flutter下不支持CameraController的startImageStream方法不支持获取摄像头实时影响流的实战教程也可以访问 https://www.itying.com/category-92-b0.html

10 回复

开发者您好,关于第一个问题,您方便提供下不支持设置fps的复现视频还有日志吗? 关于第二个问题,您设置为ImageFormatGroup.yuv420,ohos因为不支持会降级为JPEG,但是ohos中JPEG的值为2000,传回到dart侧会被识别为unknown。目前鸿蒙的图片格式只支持两种:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-e#imageformat9。 关于第三个问题,使用demo,本地没有复现您的问题,您如果还有异常的话,能否提供相关日志,方便后续分析,感谢您的理解。

更多关于HarmonyOS鸿蒙Next中flutter下不支持CameraController的startImageStream方法不支持获取摄像头实时影响流的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


编译的时候会提示fps没有这个参数cke_336.png

尊敬的开发者,您好!感谢您的反馈,问题正在加速处理中,还请关注后续版本,感谢您的理解与支持。

后续这几个点建议按“Flutter 插件能力映射”和“系统 Camera Kit 能力”分开排查。

  1. fps 不生效:先看 ohos 端插件是否把 Camera Kit 的帧率范围能力桥接到了 Dart 侧。如果插件没有暴露帧率配置,Dart 侧即使传了参数也可能只是被忽略。建议在 ohos 插件层打印最终创建 preview/photo/video 输出流时使用的 profile 和 frameRateRange。

  2. yuv420 变 unknown:HarmonyOS Camera Kit 底层有自己的格式枚举,例如 YUV_420_SP、JPEG 等;当前 Flutter camera ohos 插件对 Android 的 ImageFormatGroup 映射并不完全等价。官方前面也提到 JPEG 的值传回 Dart 侧可能识别为 unknown,所以短期不要在业务层强依赖 format.group == yuv420,应以实际 planes/data 格式和插件实现为准。

  3. torch 不生效FlashMode.torch 在 Flutter 语义里更接近持续补光,但 HarmonyOS 侧要看设备是否支持 torch/flash、当前 session 类型是否允许,以及插件是否做了完整映射。建议同时验证后置摄像头、普通拍照/视频模式下的能力查询结果。

如果业务是心率、跳绳识别这类需要稳定拿每帧数据的生产场景,我建议不要只依赖 Flutter camera 的兼容层。更稳的架构是:用 ArkTS/Native 写一层 HarmonyOS 相机模块,直接基于 Camera Kit 获取图像流和能力参数,再通过 MethodChannel/FFI 把算法需要的轻量结果回传给 Flutter。这样 fps、图像格式、补光、性能和内存回收都更可控。

如果目标是实时心率、跳绳识别这类逐帧算法,不建议把 Flutter camera 插件的 startImageStream 当作完全等价于 Android 的实现来设计。HarmonyOS 分支和 Android 官方插件目前不是完全 feature parity,官方回复里也提到了 ImageFormatGroup.yuv420 在 ohos 侧会降级为 JPEG,Dart 侧可能识别成 unknown。

建议分两条路线处理:

  1. 短期验证:先按当前 ohos camera 插件实际支持的格式跑通链路。如果只能拿 JPEG,要注意 JPEG 编解码开销较大,不太适合高帧率逐帧算法,建议降低分辨率/帧率做性能基线。

  2. 中长期方案:如果算法强依赖 YUV/每帧低延迟数据,建议用 ArkTS/Native 封装 HarmonyOS Camera Kit 的预览流/图像接收能力,在原生侧完成取帧和算法处理,只把识别结果传回 Flutter。不要把每一帧大图都跨通道传到 Dart 层,否则性能和延迟都会比较吃紧。

fps、torch、图像格式这类能力也要按设备能力和插件适配情况做降级,不建议假设 Android 行为在 HarmonyOS 上完全一致。给插件维护方或官方反馈时,最好同时提供插件分支/commit、设备型号、系统版本、期望的 format/fps/flashMode、复现 demo 和 hilog,这样更容易判断是插件未适配、设备能力限制,还是系统 API 行为差异。

不要把 Android 的 startImageStream 预期直接套到 OHOS camera 插件上。你这个场景是心率/跳绳识别,关键不是“能不能拍照”,而是能否稳定拿到低延迟、连续的帧数据,以及帧格式是否适合算法。

从你前面描述和官方回复看,当前 Flutter OHOS camera 插件在实时帧格式上和 Android 侧有差异,例如 ImageFormatGroup.yuv420 在 OHOS 侧可能不能按 Android 语义返回,格式值也可能被 Dart 侧识别成 unknown。这种情况下建议两条路线:

  1. 短期:基于现有鸿蒙化 camera 插件分支继续验证,先确认支持的实际输出格式、帧率、分辨率,并把 fps 设置失败、format 识别异常的日志提供给维护方。
  2. 中长期:实时 CV/心率算法建议做一层原生能力封装。ArkTS/Native 侧用 Camera Kit 建预览/采集链路,必要时通过 NativeImage/Surface 回调拿帧,在 Native/C++ 层做图像处理,只把识别结果或少量特征回传给 Dart,避免每帧大图跨桥传输。

如果业务强依赖 YUV 连续帧,建议先不要把全部算法绑死在 Flutter 插件 API 上,平台通道 + 原生相机采集会更可控。

使用这个分支 https://gitcode.com/openharmony-tpc/flutter_packages/blob/master/packages/camera/camera/lib/src/camera_controller.dart

可以解决,但把camera库也更换到鸿蒙的以后,发现CameraController存在跟官方的几个差异

  1. 不支持设置fps

  2. 设置imageFormatGroup为ImageFormatGroup.yuv420,但startImageStream回调的CameraImage内的format.group为ImageFormatGroup.unknown

  3. 不支持setFlashMode(FlashMode.torch);设置了,但是闪光灯没有亮,官方的可以亮

cke_203.png

蹲个后续

在HarmonyOS Next中,Flutter的CameraControllerstartImageStream方法无法获取摄像头实时影像流。这是因为鸿蒙相机框架(Camera Kit)的流式接口与Android/iOS存在底层差异,Flutter官方camera插件尚未针对鸿蒙适配该功能。当前仅支持拍照或录制视频,不支持逐帧回调。

HarmonyOS Next 下 Flutter 的 camera 插件(基于 gitcode 上的 tpc 仓库)因底层 Camera API 与 Android 差异较大,尚未实现 startImageStream。如需获取实时帧,可利用 ArkUI 原生的 XComponent 与 OH_Camera 能力,通过 PlatformView 集成。

  1. 原生侧:创建 XComponent 作为预览承载,注册 previewOutput 的帧回调。

    Camera_PreviewOutput previewOutput = cameraManager.createPreviewOutput(surfaceId);
    previewOutput.on("frameAvailable", frame -> {
        Camera_PixelMap pixelMap = frame.getPixelMap();
        byte[] yuvData = pixelMap.readPixelsToBufferSync();
        methodChannel.invokeMethod("onFrame", yuvData);
    });
    
  2. Flutter 侧:嵌入 AndroidView / PlatformViewLink,通过 MethodChannel 接收帧数据,转换为 Uint8List 后用于心率识别或物体检测。

该方法直接调用系统相机底层接口,性能与实时性足以支撑心率测量等场景。需要注意将 XComponent 的渲染模式设为 SURFACE_VIEW 以获取帧回调,且数据格式按实际输出处理(通常为 NV21)。

回到顶部