我使用微软的示例DX11VideoRenderer在Windows 10中渲染实时视频。当我只运行一个流时,视频看起来很棒。然而,当我运行超过4或5个流时,它们各自窗口中的一些视频开始断断续续地消失。这种效果可以只覆盖每个视频窗口的一部分或全部。
此外,我还从日志文件中的函数调用中得到了一些间歇性错误:
hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );返回的错误是: E_INVALIDARG一个或多个参数无效
在我的代码中,我只使用DX11VideoRenderer的Presenter.cpp和display.cpp模块。源位于:DirectX视频渲染示例
在这个阶段,我最初的怀疑是DXVideoRenderer可能不是线程安全的。我发现了有关多线程的信息:Direct3D 11多线程介绍,它声明:
虽然设备上下文(ID3D11DeviceContext)的使用不是线程安全,但Direct3D 11设备(ID3D11Device)的使用是线程安全的。
但是,由于我对每个窗口使用了单独的CPresenter类实例,因此不应该存在线程安全问题,因为每个窗口都应该有自己的ID3D11DeviceContext.实例
有没有人对这个DX11VideoRenderer软件示例有任何经验或想法,以及是什么导致了这个问题?
谢谢!
-更新-
我只能用一个窗口来复制这个问题,所以它不再是一个线程问题。如果我手动调整窗口的大小多次,我有时可以在窗口中的视频闪烁。当这种情况发生时,我在日志中看到,对VideoProcessorBlt()的相同函数调用使用相同的返回代码E_INVALIDARG失败。
发布于 2020-01-27 19:41:57
如果我手动调整窗口的大小多次,我有时可以在窗口中的视频闪烁。当这种情况发生时,我在日志中看到,对VideoProcessorBlt()的相同函数调用使用相同的返回代码E_INVALIDARG失败。
Microsoft没有记录这种行为。
DirectX9的问题也是一样的,但是错误发生在IDirect3DDevice9:Present中,就在VideoProcessBltHD之后。HRESULT代码为0x88760872,未记录0x88760872。
因此,当调整窗口大小时,可能会发生错误。
请参见H264Dxva2Decoder:
在Dxva2Renderer.cpp中,检查HANDLE_DIRECTX_ERROR_UNDOCUMENTED。
我选择的策略是暂停播放视频(参见WindowsFormProc和WM_ENTERSIZEMOVE/WM_SYSCOMMAND),这也避免了闪烁。
这样做,错误就消失了。
PS:通常,这个错误可以被安全地忽略。
我认为这个错误只是告诉您,当窗口调整大小时,底层API很难将DirectX表示与您的HWND同步,而HWND的大小变化很快。
https://stackoverflow.com/questions/50264068
复制相似问题