HarmonyOS鸿蒙Next相机双预览,获取到的数据图像会有闪烁效果是为什么?
HarmonyOS鸿蒙Next相机双预览,获取到的数据图像会有闪烁效果是为什么? 【问题描述】:我的设备是mate80pro系统是6.0.0.130在相机双预览的状态下发现,获取到的NV21数据图像显示画面有很多方块在表面一闪一闪的,但是预览效果看着是没问题的,我的相机中配置了两个previewOutput,有两个id。一个是由XComponent生成的surfaceID,另一个是ImageReceiver生成的surfaceID,这个是参考下面文档实现的。这个现象要怎么解决???
【文档链接】:双路预览(ArkTS)-开发相机应用基础能力(ArkTS)-Camera Kit(相机服务)-媒体 - 华为HarmonyOS开发者
更多关于HarmonyOS鸿蒙Next相机双预览,获取到的数据图像会有闪烁效果是为什么?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
尊敬的开发者,您好,
关于您的反馈的AVCodec的surface模式结合相机输出竖屏下的H.265/H.264裸流问题,
可参考视频编码,Surface模式下示例代码,可将相机流编码成H.264/H.265数据格式。
更多关于HarmonyOS鸿蒙Next相机双预览,获取到的数据图像会有闪烁效果是为什么?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个如果是要编码出横屏图像确实是可以的,但是如果需要竖屏的编码输出就不行了,需要实现竖屏的编码,而且还得是裸码流,像H.264、H.265这样,不能封装到MP4文件,所以也用不了编码器的setRotation参数
尊敬的开发者,您好,
关于您的反馈的问题,
如果不经过封装成文件,目前AVCodec编码无法直接设置竖屏,使用您所提到的Opengles做中间层实现是比较可行的方案。
这个情况一般是预览分辨率不合适导致的。参考《相机预览花屏解决方案》。
开发者您好,该问题可能为特殊场景,建议提交工单反馈给技术支持工程师:
https://developer.huawei.com/consumer/cn/support/feedback/#/ticketCard
尊敬的开发者,您好,本地使用IDE 6.1.0在示例代码中并未复现您的问题,为了尽快解决您的问题,需要您进一步提供如下信息:
- 是否方便提供一下完整代码?
- IDE版本
- API版本
ide版本是6.0.2.130
api版本是22
已放弃使用双预览模式 ,目前我想了解一下除了使用opengles做中间层外还有没有别的办法可以实现用AVCodec的surface模式结合相机输出竖屏下的H.265或是H.264裸流??
我也是,
双预览场景下闪烁通常因双路预览帧率不匹配或渲染时序冲突导致。HarmonyOS NEXT的Camera框架中,主预览流与副预览流(如缩略图流)可能存在不同步的buffer交换周期,造成显示层交替刷新时出现视觉闪烁。建议检查预览流的帧率设置是否一致,并确认Surface的刷新策略与相机输出对齐。
双路预览中 NV21 数据出现方块闪烁,大概率是因为 ImageReceiver 回调里处理 YUV 数据耗时,阻塞了相机缓冲区循环,导致后续帧被丢弃或覆盖,显示时出现撕裂/脏块。可以按以下步骤排查:
- 确保 ImageReceiver 配置一致:接收尺寸必须与
previewOutput的尺寸完全相同,且format固定为CAMERA_FORMAT_YUV_420_888(即 NV21)。 - 增加缓冲区数量:创建 ImageReceiver 时把
capacity设成 5 或更大,避免缓冲区耗尽。 - 轻量化回调:
on('imageArrival')中只做数据拷贝(如image.getComponent()取出ArrayBuffer并复制),立刻image.release(),然后把拷贝数据抛到子线程去转换/显示,千万不要在回调里直接做耗时的 YUV→RGB 转换或 UI 渲染。 - 检查显示端:如果直接将 YUV 数据填到
PixelMap并刷新Image组件,必须用正确的 YUV→RGB 算法;更建议直接在 XComponent 里用 Native 窗口渲染,避免 Java/JS 层的编解码丢帧。
按上述调整后,闪烁块通常都会消失。

