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

DxgiOutputDuplication纹理转NV12时VideoProcessorBlt报错0x80070057求助

DXGI_FORMAT_B8G8R8A8_UNORM转NV12时VideoProcessorBlt返回E_INVALIDARG的排查与解决

针对你调用m_pD3D11VideoContext->VideoProcessorBlt返回0x80070057(E_INVALIDARG)的问题,结合桌面复制纹理的参数(2560x1440、DXGI_FORMAT_B8G8R8A8_UNORM、BindFlags=28、MiscFlags=0x2900),可以从以下核心方向排查:

1. 输出NV12纹理的参数合法性

NV12是平面YUV格式,对纹理创建有严格要求:

  • 必须创建单ArraySize、单MipLevel的纹理,格式明确为DXGI_FORMAT_NV12,BindFlags需包含D3D11_BIND_RENDER_TARGET(VideoProcessorBlt需要将结果渲染到目标);
  • 禁止设置D3D11_RESOURCE_MISC_GDI_COMPATIBLE(NV12格式不支持GDI兼容,而你输入纹理的MiscFlags包含该标识,输出纹理不能沿用);
  • 分辨率必须满足对齐要求:宽度是4的倍数,高度是2的倍数(你的2560x1440符合,但创建时要严格匹配输入分辨率,不能缩放或错位)。

示例创建NV12纹理的核心代码:

D3D11_TEXTURE2D_DESC nv12Desc = {};
nv12Desc.Width = 2560;
nv12Desc.Height = 1440;
nv12Desc.MipLevels = 1;
nv12Desc.ArraySize = 1;
nv12Desc.Format = DXGI_FORMAT_NV12;
nv12Desc.SampleDesc.Count = 1;
nv12Desc.SampleDesc.Quality = 0;
nv12Desc.Usage = D3D11_USAGE_DEFAULT;
nv12Desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
nv12Desc.CPUAccessFlags = 0;
nv12Desc.MiscFlags = 0; // 移除GDI_COMPATIBLE标识

ID3D11Texture2D* pNV12Texture = nullptr;
HRESULT hr = pD3DDevice->CreateTexture2D(&nv12Desc, nullptr, &pNV12Texture);

2. VideoProcessorBlt参数结构体的正确性

检查D3D11_VIDEO_PROCESSOR_BLT_PARAMETERS的关键字段:

  • TargetIndex设为0(对应NV12纹理的子资源,NV12的Y/UV平面由纹理自动管理,无需手动指定子资源索引);
  • SourceRectangle必须严格匹配输入纹理的2560x1440分辨率,不能出现负数或超出边界的数值;
  • DestinationRectangle需与输出NV12纹理的分辨率完全一致;
  • 确认VideoProcessorInputView(VPIV)绑定的是输入的B8G8R8A8_UNORM纹理,格式匹配;VideoProcessorOutputView(VPOV)绑定的是NV12纹理,格式为DXGI_FORMAT_NV12。

3. 输入纹理的兼容性验证

输入纹理的D3D11_RESOURCE_MISC_GDI_COMPATIBLE标识可能导致Video Processor处理异常,可尝试以下步骤:

  • 创建一个临时的非GDI兼容纹理(格式仍为B8G8R8A8_UNORM),用ID3D11DeviceContext::CopyResource将桌面复制的纹理内容拷贝到临时纹理;
  • 以临时纹理作为输入,调用VideoProcessorBlt进行格式转换,排查是否是GDI兼容纹理导致的参数错误。

4. 设备格式支持预检查

在创建Video Processor前,调用ID3D11VideoDevice::CheckVideoProcessorFormatSupport验证设备支持情况:

UINT supportFlags = 0;
HRESULT hr = pD3D11VideoDevice->CheckVideoProcessorFormatSupport(
    pVideoProcessor,
    DXGI_FORMAT_B8G8R8A8_UNORM,
    DXGI_FORMAT_NV12,
    &supportFlags
);

确保supportFlags包含D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT和D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT,确认设备支持该格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:55:18