在win8和更高版本中,我可以直接使用MFCreateDXGISurfaceBufferWrapper,但是在Win7系统上不支持这个接口,所以我只能在CPU上复制它("_capture_texture_2D“是在Win7上用D3D11_USAGE_STAGING创建的),但是最后显示的图像是倾斜的。我觉得转换结果的长度或宽度是不正确的:
。
HRESULT = E_NOTIMPL;CComPtr media_buffer;if (IsWindows8OrGreater()) { hr =IsWindows8OrGreater _capture_texture2d,0,FALSE,&media_buffer);CComPtr twod_buffer;hr = media_buffer->QueryInterface(&twod_buffer);RETURN_ON_FAIL( hr );DWORD长度= 0;hr = twod_buffer->GetContiguousLength(& length );RETURN_ON_FAIL(hr);hr =media_buffer->SetCurrentLength(长度);RETURN_ON_FAIL( hr );{ D3D11_TEXTURE2D_DESC desc;_D3D11_TEXTURE2D_DESC_texture2d->GetDesc(&desc);UINT32 img_size = 0;hr= MFCalculateImageSize(MFVideoFormat_RGB32,desc.Width,desc.Height,&img_size);RETURN_ON_FAIL(hr);D3D11_MAPPED_SUBRESOURCE资源;UINT子资源= D3D11CalcSubresource(0,0,0);hr =_capture_texture2d_context->Map( D3D11_MAP_READ,子资源,D3D11_MAP_READ,0,&resource);RETURN_ON_FAIL( hr );hr = MFCreateMemoryBuffer(img_size,&media_buffer);if (成功(Hr)){字节*dst = NULL;hr= media_buffer->Lock(&dst,NULL,NULL);如果(size_t i= 0;i< desc.Height;i++) { memcpy( dst,src,desc.Width * 4);src += resource.RowPitch;dst += desc.Width * 4;}_capture_texture2d_buffer->SetCurrentLength(Img_size);} RETURN_ON_FAIL( hr );CComPtr样本;hr =MFCreateSample(样本);RETURN_ON_FAIL( hr );hr= sample->AddBuffer(media_buffer);RETURN_ON_FAIL(hr);
发布于 2020-10-28 06:36:40
使用函数MFGetStrideForBitmapInfoHeader和MFCopyImage解决方案:
D3D11_TEXTURE2D_DESC desc;
_capture_texture2d->GetDesc(&desc);
UINT32 img_size = 0;
GUID dst_format = MFVideoFormat_RGB32;
hr = MFCalculateImageSize(dst_format, desc.Width, desc.Height, &img_size);
RETURN_ON_FAIL(hr);
LONG dst_stride = 0;
hr = MFGetStrideForBitmapInfoHeader(dst_format.Data1, desc.Width, &dst_stride);
RETURN_ON_FAIL(hr);
D3D11_MAPPED_SUBRESOURCE resource;
UINT subresource = D3D11CalcSubresource(0, 0, 0);
hr = immediate_context->Map(_capture_texture2d, subresource, D3D11_MAP_READ, 0, &resource);
RETURN_ON_FAIL(hr);
hr = MFCreateMemoryBuffer(img_size, &media_buffer);
if (SUCCEEDED(hr))
{
BYTE *dst_data = NULL;
hr = media_buffer->Lock(&dst_data, NULL, NULL);
if (SUCCEEDED(hr))
{
if (dst_stride >= 0)
{
hr = MFCopyImage(dst_data, dst_stride, (BYTE*)resource.pData, resource.RowPitch, desc.Width * 4, desc.Height);
}
else
{
BYTE *src_ptr = (BYTE*)resource.pData;
BYTE *dst_ptr = dst_data - dst_stride * (desc.Height - 1);
size_t copy_bytes = min(resource.RowPitch, (UINT)-dst_stride);
for (size_t i = 0; i < desc.Height; i++)
{
memcpy(dst_ptr, src_ptr, copy_bytes);
src_ptr += resource.RowPitch;
dst_ptr += dst_stride;
}
}
media_buffer->SetCurrentLength(img_size);
media_buffer->Unlock();
}
}
immediate_context->Unmap(_capture_texture2d, subresource);
...https://stackoverflow.com/questions/64556784
复制相似问题