2015-12-04 37 views
1

我使用IMFMediaEngine播放視頻流(平滑流媒體,HLS),並可能與的PlayReady以後運行。IMFMediaEngine始終在640×480使用DirectComposition

它奇妙地使用TransferVideoFrame將視頻繪製到紋理上。但我知道這是PlayReady + DRM + 1080p視頻的要求,可以使用DirectComposition。所以我正在努力做到這一點。

這樣做的另一個好處是,視頻幀渲染獨立於應用程序,所以應用程序UI中可能的口吃或滯後不會影響視頻播放。

我能使其工作,但不幸的是,IDCompositionVisual我使用最後總是被限制爲640×480 。所以視頻必須縮小到它。然後,如果我將其轉化爲規模,我會得到一張難看的圖片。

我註冊的視覺是這樣的:

pMediaAttributes->SetUnknown(MF_MEDIA_ENGINE_PLAYBACK_VISUAL, m_pDcompVideoVisual); 

如這裏記載: https://msdn.microsoft.com/en-us/library/windows/desktop/hh162850(v=vs.85).aspx

力圖打造一個前表面上和視覺SetContent不會改變任何東西。這就像視頻播放器用它自己的表面覆蓋它,640x480。將它固定在簡單的播放器上並找到真正的解決方案,並且能夠在收到事件時指定可視化表面的大小。

由於這是IMFMediaEngine中用於指定DirectComposition表面的選項,因此必須有一種方法可以使此工作成爲可能。

回答

0

基於我看到IMFMediaEngine的文檔,你應該能夠處理使用IMFMediaEngineProtectedContent->TransferVideoFrame 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"); 

給這與1080保護的內容拍攝。

+0

謝謝。我確實得到了微軟的支持,他們也說了同樣的話。出於某種原因,DirectComposition在Windows10 XboxOne上停止工作。數字版權管理的要求不是技術性的,而是明顯的非書面規則。所以程序員決不會直接操縱框架。我們正在提出更高的問題以確保仍然如此。 同時,感謝您的答案,這是正確的做法。 –