我有一个基本上是视频播放引擎的C++非托管DLL。它使用WMF流式传输视频,并使用TransferVideoFrame将帧绘制到ID3D11Texture2D。从C++发送ID3D11Texture2D到C#UWP MediaPlayer
这一切都工作正常。然而,我的任务是实现MPEG_DASH流切换,因此我创建了一个使用MediaPlayer和AdaptiveStreaming类的C#包装器,以使DASH和HLS流工作。
我想弄明白的是,如何将帧像素数据从MediaPlayer发送到C++ DLL中以将其绘制到ID3DTexture2D。
在C++中,我有一个返回指针到ID3D11Texture2D功能,
ID3D11Texture2D* VideoPlayer::GetVideoTextureSurface()
{
if (_ctxt.m_spVideoTexSRV) // ComPtr<ID3D11ShaderResourceView>
{
return _ctxt.m_spVideoTex.Get(); // ComPtr<ID3D11Texture2D>
}
else return nullptr;
}
这是我从C#调用,并得到作为一个IntPtr。
[DllImport("VideoPlayer")]
private static extern IntPtr GetVideoTextureSurface();
而在C#中的MediaPlayer有一个方法:
MediaPlayer.CopyFrameToVideoSurface(IDirect3DSurface destination)
,我要使用,使MediaPlayer的绘制其帧到C++ ID3D11Texture3D。但我不知道如何将一个IntPtr传入。我试图通过直接绘制纹理来多次避免复制帧缓冲区。
我甚至不确定这是否是最好的方法。我可以直接从C++使用MediaPlayer,但我甚至不知道如何实例化它。在C#中,它只是:
MediaPlayer _mediaPlayer = new MediaPlayer();
但是当我尝试用C++来创建它,我得到的错误,“不完整的类型是不允许的。”任何想法,见解或帮助表示赞赏。
非常感谢。我会试试这个! –
@GlenRhodes,我也很好奇,看看它是否有效:)让我知道结果,如果它解决了问题,不要忘记检查答案,以便其他人可以看到 –