Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ IMFMediaEngine始终使用DirectComposition以640x480的速度运行_C++_Windows_Video_Xbox One - Fatal编程技术网

C++ IMFMediaEngine始终使用DirectComposition以640x480的速度运行

C++ IMFMediaEngine始终使用DirectComposition以640x480的速度运行,c++,windows,video,xbox-one,C++,Windows,Video,Xbox One,我正在使用IMFMediaEngine播放视频流(平滑流,HLS),稍后可能会使用PlayReady 使用TransferVideoFrame将视频绘制到纹理上,效果非常好。但我明白,使用DirectComposition是PlayReady+DRM+1080p视频的一项要求。所以我正在努力让这一切顺利进行 这样做的另一个优点是,视频帧渲染独立于应用程序,因此应用程序UI中可能出现的口吃或延迟不会影响视频播放 我可以让它工作,但不幸的是,我使用的IDCompositionVisual总是被限制在

我正在使用IMFMediaEngine播放视频流(平滑流,HLS),稍后可能会使用PlayReady

使用TransferVideoFrame将视频绘制到纹理上,效果非常好。但我明白,使用DirectComposition是PlayReady+DRM+1080p视频的一项要求。所以我正在努力让这一切顺利进行

这样做的另一个优点是,视频帧渲染独立于应用程序,因此应用程序UI中可能出现的口吃或延迟不会影响视频播放

我可以让它工作,但不幸的是,我使用的IDCompositionVisual总是被限制在640x480。因此,视频必须缩小规模。然后如果我把它放大,我会得到一张丑陋的拉伸图片

我通过以下方式注册视频:

pMediaAttributes->SetUnknown(MF_MEDIA_ENGINE_PLAYBACK_VISUAL, m_pDcompVideoVisual);
如本文所述:

尝试在视觉上创建曲面和设置内容不会改变任何东西。就像视频播放器用自己的表面覆盖它一样,640x480。如果能将它放在简单的播放器上,找到这个问题的真正解决方案,并能在收到MF\u MEDIA\u ENGINE\u事件\u FORMATCHANGE事件时指定视觉表面的大小,那就太好了


因为这是IMFMediaEngine中指定DirectComposition曲面的一个选项,所以必须有一种方法来实现这一点。

根据我看到的文档,您应该能够使用以下方式处理受DRM保护的内容:

对于受保护的内容,请调用此方法,而不是IMFMediaEngine::TransferVideoFrame方法

您提供的示例的VideoPlayer::CaptureFrame方法中可以包含类似的内容:

// Transfer the frame to the texture
auto pIMFMediaEngineUnknown = reinterpret_cast<IUnknown *>(m_pMediaEngine);
IMFMediaEngineProtectedContent *temp = 0;
pIMFMediaEngineUnknown->QueryInterface(IID_PPV_ARGS(&temp));
DWORD flags = 0;
HRESULT ret = temp->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor, &flags);
temp->Release();

//HRESULT ret = m_pMediaEngine->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor);
assert(ret == S_OK && "Failed to transfer video frame");
//将帧传输到纹理
自动PIMFMEDIAENGINENKNOWN=重新解释铸件(m\U pMediaEngine);
IMFMediaEngineProtectedContent*temp=0;
pIMFMediaEngineUnknown->查询接口(IID_PPV_ARGS(&temp));
DWORD标志=0;
HRESULT ret=temp->TransferVideoFrame(m_pRenderTarget、&videoRect、&targetRect、&borderColor、&flags);
临时->释放();
//HRESULT ret=m_pMediaEngine->TransferVideoFrame(m_pRenderTarget、&videoRect、&targetRect、&borderColor);
断言(ret==S_OK&“传输视频帧失败”);

使用1080p受保护的内容对此进行演示。

根据我看到的文档,您应该能够使用以下方式处理受DRM保护的内容:

对于受保护的内容,请调用此方法,而不是IMFMediaEngine::TransferVideoFrame方法

您提供的示例的VideoPlayer::CaptureFrame方法中可以包含类似的内容:

// Transfer the frame to the texture
auto pIMFMediaEngineUnknown = reinterpret_cast<IUnknown *>(m_pMediaEngine);
IMFMediaEngineProtectedContent *temp = 0;
pIMFMediaEngineUnknown->QueryInterface(IID_PPV_ARGS(&temp));
DWORD flags = 0;
HRESULT ret = temp->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor, &flags);
temp->Release();

//HRESULT ret = m_pMediaEngine->TransferVideoFrame(m_pRenderTarget, &videoRect, &targetRect, &borderColor);
assert(ret == S_OK && "Failed to transfer video frame");
//将帧传输到纹理
自动PIMFMEDIAENGINENKNOWN=重新解释铸件(m\U pMediaEngine);
IMFMediaEngineProtectedContent*temp=0;
pIMFMediaEngineUnknown->查询接口(IID_PPV_ARGS(&temp));
DWORD标志=0;
HRESULT ret=temp->TransferVideoFrame(m_pRenderTarget、&videoRect、&targetRect、&borderColor、&flags);
临时->释放();
//HRESULT ret=m_pMediaEngine->TransferVideoFrame(m_pRenderTarget、&videoRect、&targetRect、&borderColor);
断言(ret==S_OK&“传输视频帧失败”);

使用1080p受保护的内容进行拍摄。

谢谢。事实上,我得到了微软的支持,他们也说了同样的话。由于某种原因,DirectComposition停止在Windows10 Xbox上工作。DRM要求不是一项技术要求,而是一项非书面规定。因此程序员永远不会直接操作框架。我们正在把这个问题提得更高,以确保这仍然是事实。同时,谢谢你的回答,这是正确的做法。谢谢。事实上,我得到了微软的支持,他们也说了同样的话。由于某种原因,DirectComposition停止在Windows10 Xbox上工作。DRM要求不是一项技术要求,而是一项非书面规定。因此程序员永远不会直接操作框架。我们正在把这个问题提得更高,以确保这仍然是事实。同时,谢谢你的回答,这是正确的做法。