安卓端CameraController设bgra8888仍返回YUV420如何直接获取RGB帧
问题原因
Flutter官方camera插件的ImageFormatGroup.bgra8888仅对iOS端生效,安卓端未做对应格式的输出适配,无论是否传入该参数,安卓侧默认都会回退到YUV420_888格式输出,这就是你拿到三个平面长度为4:2:0比例的根本原因。
可行解决方案
方案1:原生侧预处理再透传
直接在安卓原生层承接相机输出的YUV帧,用安卓原生的libyuv或者RenderScript做格式转换后,再通过FFI把RGB数据传给C++层处理,该方案的性能开销远低于在Dart层转格式再传递,大部分中低端机型也能跑满30fps逐帧处理需求。方案2:使用第三方相机插件替代官方camera
可以用camera_android_camerax这类扩展插件,其实现的CameraController支持直接配置输出RGBA格式,安卓端可以直接拿到单平面的RGBA8888数据,无需自行做格式转换。
示例初始化代码如下:
final cameraController = AndroidCameraXController( resolutionPreset: ResolutionPreset.medium, imageFormat: ImageFormat.rgba8888, );
- 方案3:仍用官方插件,在C层做格式转换
如果不想替换现有依赖,不要在Dart层做逐像素转换,直接把YUV三个平面的byte数组整体通过FFI传给C层,用OpenCV自带的cv::cvtColor配合CV_YUV2BGRA_NV21(可根据安卓实际YUV排列调整参数)做转换,性能损耗极低,实测1080p帧转换耗时在10ms以内,不会影响常规实时处理流程。
注意:不要使用ImageFormatGroup.jpeg格式做实时处理,jpeg是压缩格式,解压开销远高于YUV转RGB,完全不适合逐帧处理场景。
内容的提问来源于stack exchange,提问作者JammingThebBits
相关产品推荐
相关产品推荐

