在DirectX 11中渲染h264视频帧

3

我对于DirectX还很陌生。我正在尝试编写一个自定义的IP相机视频播放器,为此我使用了DirectX11作为渲染解码图像的方式,Wpf Gui是我的前端。

我是一名C#开发人员,之前使用的是由Microsoft不再更新的托管DirectX,因此转向WPF和DirectX11。

到目前为止,我的应用程序在帧渲染方面全部正常运行。

我已成功创建了D3DImage源,将其用于Wpf应用程序,并成功创建了我的视口、设备和共享资源,因为D3DImage仅支持Directx9。我使用SharpDX作为DirectX API的封装器。

现在我的问题是,我似乎找不到一种从解码后的图像字节中创建/更新纹理的方法,或者正确的方法是什么,以便从接收到的字节中渲染解码后的图像。

如果有人能够提供任何帮助,或者指导我如何处理这个问题,那就太好了。

谢谢。

1个回答

2

经过将近两周的搜索和尝试,我终于找到了解决我的问题的方法,如下所示。

然而,这确实显示了图像,但不是我预期的那样,但我相信这对我来说是一个开始,因为下面的代码回答了我最初提出的问题。

Device.ImmediateContext.ClearRenderTargetView(this.m_RenderTargetView, Color4.Black);

    Texture2DDescription colordesc = new Texture2DDescription
    {
        BindFlags = BindFlags.ShaderResource,
        Format = m_PixelFormat,
        Width = iWidth,
        Height = iHeight,
        MipLevels = 1,
        SampleDescription = new SampleDescription(1, 0),
        Usage = ResourceUsage.Dynamic,
        OptionFlags = ResourceOptionFlags.None,
        CpuAccessFlags = CpuAccessFlags.Write,
        ArraySize = 1
    };

    Texture2D newFrameTexture = new Texture2D(this.Device, colordesc);

    DataStream dtStream = null;
    DataBox dBox = Device.ImmediateContext.MapSubresource(newFrameTexture, 0, MapMode.WriteDiscard, 0, out dtStream);
    if (dtStream != null)
    {
        int iRowPitch = dBox.RowPitch;

        for (int iHeightIndex = 0; iHeightIndex < iHeight; iHeightIndex++)
        {
            //Copy the image bytes to Texture
            dtStream.Position = iHeightIndex * iRowPitch;
             Marshal.Copy(decodedData, iHeightIndex * iWidth * 4, new IntPtr(dtStream.DataPointer.ToInt64() + iHeightIndex * iRowPitch), iWidth * 4);
        }
    }

    Device.ImmediateContext.UnmapSubresource(newFrameTexture, 0);


    Device.ImmediateContext.CopySubresourceRegion(newFrameTexture, 0, null, this.RenderTarget, 0);
    var shaderRescVw = new ShaderResourceView(this.Device, this.RenderTarget);

    Device.ImmediateContext.PixelShader.SetShaderResource(0, shaderRescVw);

    Device.ImmediateContext.Draw(6, 0);
    Device.ImmediateContext.Flush();
    this.D3DSurface.InvalidateD3DImage();

    Disposer.SafeDispose(ref newFrameTexture);

使用上述代码,我现在能够使用接收到的新图像数据填充纹理,但是如下图中红框所示,图像的颜色/像素没有正确呈现。
渲染图像的截图: enter image description here 图像字节以BGRA32像素格式通过解码器接收。 如何解决这个问题,任何建议都将非常有帮助。

我终于解决了图像问题。首先,原始纹理没有用正确的尺寸进行初始化。其次,为了正确渲染图像,我必须确保考虑每个像素的字节数。因为我的像素格式是bgra32,也就是每个像素4个字节。 - Kartik150

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接