0

我正在使用 Microsoft 示例DX11VideoRenderer在 Windows 10 中渲染实时视频。当我只运行一个流时,视频看起来很棒。但是,当我运行超过 4 或 5 个流时,它们各自窗口中的一些视频开始间歇性地消隐。效果可以只覆盖每个视频窗口的一部分或全部。

此外,我的日志文件中的此函数调用也出现了一些间歇性错误:

hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );

返回的错误是:E_INVALIDARG 一个或多个参数无效 0x80070057

我只在我的代码中使用了DX11VideoRenderer的Presenter.cppdisplay.cpp模块。源码位于: DirectX 视频渲染示例

在这个阶段我最初的怀疑是 DXVideoRenderer 可能不是线程安全的。我找到了有关多线程的信息:Direct3D 11 中的多线程简介,其中指出:

虽然设备上下文 (ID3D11DeviceContext) 的使用不是线程安全的,但 Direct3D 11 设备 (ID3D11Device) 的使用是线程安全的。

但似乎由于我为每个窗口使用CPresenter类的单独实例,因此ID3D11DeviceContext不是线程安全的应该没有问题,因为每个窗口都应该有它自己的ID3D11DeviceContext实例。

是否有人对此 DX11VideoRenderer 软件示例有任何经验或想法,以及可能导致此问题的原因是什么?

谢谢!

-更新-

我已经能够仅用一个窗口复制该问题,因此它不再是线程问题。如果我多次手动调整窗口大小,有时我会使窗口中的视频闪烁。发生这种情况时,我在日志中看到相同的函数调用VideoProcessorBlt()失败并返回相同的代码E_INVALIDARG

4

1 回答 1

1

如果我多次手动调整窗口大小,有时我会使窗口中的视频闪烁。发生这种情况时,我在日志中看到对 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 同步,这会迅速改变大小。

于 2020-01-27T19:41:57.307 回答