我正在使用 Microsoft 示例DX11VideoRenderer在 Windows 10 中渲染实时视频。当我只运行一个流时,视频看起来很棒。但是,当我运行超过 4 或 5 个流时,它们各自窗口中的一些视频开始间歇性地消隐。效果可以只覆盖每个视频窗口的一部分或全部。
此外,我的日志文件中的此函数调用也出现了一些间歇性错误:
hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );
返回的错误是:E_INVALIDARG 一个或多个参数无效 0x80070057
我只在我的代码中使用了DX11VideoRenderer的Presenter.cpp和display.cpp模块。源码位于: DirectX 视频渲染示例
在这个阶段我最初的怀疑是 DXVideoRenderer 可能不是线程安全的。我找到了有关多线程的信息:Direct3D 11 中的多线程简介,其中指出:
虽然设备上下文 (ID3D11DeviceContext) 的使用不是线程安全的,但 Direct3D 11 设备 (ID3D11Device) 的使用是线程安全的。
但似乎由于我为每个窗口使用CPresenter类的单独实例,因此ID3D11DeviceContext不是线程安全的应该没有问题,因为每个窗口都应该有它自己的ID3D11DeviceContext实例。
是否有人对此 DX11VideoRenderer 软件示例有任何经验或想法,以及可能导致此问题的原因是什么?
谢谢!
-更新-
我已经能够仅用一个窗口复制该问题,因此它不再是线程问题。如果我多次手动调整窗口大小,有时我会使窗口中的视频闪烁。发生这种情况时,我在日志中看到相同的函数调用VideoProcessorBlt()
失败并返回相同的代码E_INVALIDARG。