Windows Media Player中的DXVA2解码器MFT,具有多个监视器显示

时间:2017-01-05 17:24:57

标签: wmp dxva

我的DXVA2解码器'空白'当Windows Media Player的中心被拖动到(或启动)辅助监视器时。移动回主屏幕后,视频会重新显示。注意我没有设置D3DPRESENTFLAG_DEVICECLIP。

虽然我更愿意找到一种方法让它无需处理,但我确实通过IDirect3DDeviceManager9 :: TestDevice()返回DXVA2_E_NEW_VIDEO_DEVICE来获取此问题的通知。

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,但无济于事。

BTW我在初始化时没有问题使用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;

任何缺失都是零' d。

我对win8和win10也有同样的问题。

任何帮助/指示赞赏。

1 个答案:

答案 0 :(得分:0)

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

无论如何,解决方案是通过释放所有内容然后恢复来创建我自己的重置。解决方案很慢,但现在可以使用..