You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MediaPipe适配Android YUV_420_888格式实现实时手势检测

可用解决方案

MediaPipe原生支持方案

  • MediaPipe内置ImageToImageCalculator原生支持YUV到RGB的硬件加速转换,无需引入额外依赖,也不需要手动实现转换逻辑。你只需在手势检测的Graph配置中添加该节点,输入传入Camera2输出的YUV_420_888格式帧,节点输出即可直接供给后续MediaPipe处理单元使用。
  • 若你使用MediaPipe Android官方封装的API,可直接将Camera2拿到的Image实例传入FrameInputImage构建器,显式指定输入格式为ImageFormat.YUV_420_888,MediaPipe内部会自动完成格式转换,示例代码如下:
// cameraImage为Camera2回调拿到的YUV_420_888格式Image对象
FrameInputImage inputImage = FrameInputImage.builder()
    .setImage(cameraImage, ImageFormat.YUV_420_888)
    .build();
// 直接传入MediaPipe处理器即可
gestureDetector.process(inputImage);

原生Android系统层面方案

方案1:RenderScript ScriptIntrinsicYuvToRGB转换

该方案为系统原生API,无额外包体积增量,内部自带硬件加速,性能是手动循环转换的10~30倍,入门开发者可快速接入:

  • 初始化阶段创建RenderScript实例和转换脚本:
RenderScript rs = RenderScript.create(context);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
  • 预先分配对应尺寸的输入输出Allocation,每次Camera2返回YUV帧时,将帧数据写入输入Allocation,执行脚本后即可从输出Allocation拿到RGB格式的Bitmap:
// 写入YUV数据到输入Allocation
yuvAllocation.copyFrom(yuvByteArray);
// 执行转换
yuvToRgbIntrinsic.forEach(rgbAllocation);
// 拿到RGB Bitmap
rgbAllocation.copyTo(rgbBitmap);

方案2:HardwareBuffer零拷贝转换(Android 8.0+)

如果你的应用最低支持Android 8.0(API level 26),可直接使用HardwareBuffer做零拷贝转换:将Camera2的输出Surface绑定到HardwareBuffer实例,拿到的YUV帧可直接转换为RGB纹理传给MediaPipe,全程无CPU拷贝,性能最高。

内容的提问来源于stack exchange,提问作者CSRd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:15:03