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
相关产品推荐
相关产品推荐

