Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示

Posted

技术标签:

【中文标题】Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示【英文标题】:DXVA2 Decoder MFT in Windows Media Player with multiple monitor displays 【发布时间】:2017-01-05 17:24:57 【问题描述】:

当 Windows Media Player 的中心被拖到(或在其上启动)辅助监视器时,我的 DXVA2 解码器“空白”。移回主要视频时,视频会重新出现。注意我没有设置 D3DPRESENTFLAG_DEVICECLIP。

虽然我更希望找到一种无需处理即可工作的方法,但我确实通过返回 DXVA2_E_NEW_VIDEO_DEVICE 的 IDirect3DDeviceManager9::TestDevice( ) 收到有关此问题的通知。

IDirect3DDeviceManager9::CloseDeviceHandle / OpenDeviceHandle 没有削减它(尽管 MSDN 指出了所有必需的)所以我的重置处理程序类似于:

ReleaseBuffers();   // free surfaces

SAFE_RELEASE(m_decoderService);

hr = m_pDXManager->CloseDeviceHandle(m_hDevice);
hr = m_pDXManager->OpenDeviceHandle(&m_hDevice);
hr = m_pDXManager->LockDevice(m_hDevice, &pDev, true);

hr = pDev->Reset(d3DPP);  // FAILS 0x8876086c !!!!

于是我尝试创建一个新的 dx 设备(使用桌面作为 hwnd)然后

 m_pDXManager->ResetDevice( new_device, token); 

但在 IDirect3DDevice9::Reset() 上仍然没有乐趣。

我也尝试使用 DXVA2CreateDirect3DDeviceManager9 创建新的 IDirect3DDeviceManager9,但无济于事。

顺便说一句,我在初始化时使用 IDirect3DDevice9::Reset() 没有任何问题,稍后使用相同的 D3DPRESENT_PARAMETERS 所以不要认为这些是问题,但它们在这里(调用后)

    d3DPP[n].BackBufferWidth = 1920;
    d3DPP[n].BackBufferHeight = 1080;
    d3DPP[n].BackBufferCount = 1;
    d3DPP[n].BackBufferFormat = D3DFMT_X8R8G8B8;
    d3DPP[n].SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3DPP[n].hDeviceWindow = NULL;
    d3DPP[n].Windowed = true;
    d3DPP[n].Flags = D3DPRESENTFLAG_VIDEO;
    d3DPP[n].FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3DPP[n].PresentationInterval = D3DPRESENT_INTERVAL_ONE;

任何缺失都归零。

win8和win10也有同样的问题。

任何帮助/指针表示赞赏。

【问题讨论】:

【参考方案1】:

我有一个可以在辅助显示器上恢复视频的工作处理程序(大约一秒钟后)。如果有人可以帮助我,我当然希望它是无缝的。

无论如何,解决方案是通过绝对释放所有内容然后恢复来创建我自己的重置。解决方案很慢,但目前有效..

【讨论】:

以上是关于Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示的主要内容,如果未能解决你的问题,请参考以下文章

windows media player和media player classic有啥区别?

Windows Media Player显示空间不足

Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示

是否可以将视频嵌入Windows Media Player?

windows media player有啥用,怎么用?

更改 Windows Media Player 的目标扬声器