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

Unreal中如何使用C++访问MediaTexture中的图像数据

Unreal Engine MediaTexture 像素数据获取方案

蓝图实现方案

适合低频、快速原型开发场景:

  • 提前创建和MediaTexture分辨率一致的Render Target资源
  • 调用Draw Material to Render Target节点,输入参数:
    • 目标Render Target:刚创建的中转RT
    • 材质:绑定了MediaTexture的Unlit材质(或直接传入MediaTexture对应的默认材质)
  • 调用Read Render Target Pixels节点,直接输出FColor类型的像素数组

注意:该方案CPU-GPU同步开销较高,不要高频每帧调用


C++实现方案

方案1:Render Target中转(兼容所有版本,稳定性高)

核心逻辑和蓝图一致,性能略高于蓝图实现:

// 需提前引入头文件:#include "Kismet/GameplayStatics.h"
UMediaTexture* MediaTex = /* 你的MediaTexture实例 */;
UTextureRenderTarget2D* TempRT = /* 提前创建的分辨率匹配的RT */;

// 绘制MediaTexture到RenderTarget
UGameplayStatics::DrawMaterialToRenderTarget(GetWorld(), TempRT, MediaTex->GetMaterial());

// 读取像素到数组
TArray<FColor> PixelData;
TempRT->GetColorData(PixelData);

方案2:直接读取RHI资源(性能最优,适合高频读取)

跳过Render Target中转,直接从MediaTexture的GPU资源读取数据,适合视频流逐帧处理场景:

// 需提前引入头文件
// #include "MediaTexture.h"
// #include "RHI.h"
// #include "Rendering/RenderingCommon.h"
// #include "RHICommandList.h"

if (!MediaTex || !MediaTex->Resource) return;
FTexture2DRHIRef TexRHI = MediaTex->Resource->GetTexture2DRHI();
if (!TexRHI.IsValid()) return;

int32 Width = TexRHI->GetSizeX();
int32 Height = TexRHI->GetSizeY();
TArray<FColor> PixelData;
PixelData.SetNumUninitialized(Width * Height);

// 向渲染线程提交读取指令
ENQUEUE_RENDER_COMMAND(ReadMediaTexData)(
    [TexRHI, Width, Height, &PixelData](FRHICommandListImmediate& RHICmdList)
    {
        RHICmdList.ReadSurfaceData(
            TexRHI,
            FIntRect(0, 0, Width, Height),
            PixelData,
            FReadSurfaceDataFlags()
        );
    }
);

// 同步等待渲染线程完成读取,非高频场景可直接用,高频场景建议改为异步回调避免阻塞游戏线程
FlushRenderingCommands();

注意:如果需要获取BGRA、YUV等其他格式的像素数据,可修改FReadSurfaceDataFlags参数适配对应像素格式


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:02