1

我正在使用IMFMediaEngine来播放视频流(Smooth Streaming,HLS),稍后可能还会使用PlayReady 。

它使用TransferVideoFrame将视频绘制到纹理上效果很好。但我知道使用 DirectComposition 是 PlayReady + DRM + 1080p 视频的要求。所以我试图让这个工作。

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

我能够让它工作,但不幸的是,我使用的IDCompositionVisual总是被限制为640x480。所以视频必须缩小到它。然后,如果我将其转换为按比例放大,我会得到一张丑陋的拉伸图片。

我正在以这种方式注册视觉:

pMediaAttributes->SetUnknown(MF_MEDIA_ENGINE_PLAYBACK_VISUAL, m_pDcompVideoVisual);

如此处所述: https ://msdn.microsoft.com/en-us/library/windows/desktop/hh162850(v=vs.85).aspx

尝试在 Visual 上创建表面优先和SetContent不会改变任何内容。就像视频播放器用它自己的表面覆盖它一样,640x480。把它贴在简单的播放器上真的很好,找到这个问题的真正解决方案,并且能够在我收到MF_MEDIA_ENGINE_EVENT_FORMATCHANGE事件时指定 Visual Surface 的大小。

因为这是 IMFMediaEngine 中用于指定 DirectComposition 表面的一个选项,所以必须有一种方法来完成这项工作。

4

1 回答 1

0

根据我看到的IMFMediaEngine文档,您应该能够使用IMFMediaEngineProtectedContent->TransferVideoFrame处理受 DRM 保护的内容:

“<em>对于受保护的内容,请调用此方法而不是 IMFMediaEngine::TransferVideoFrame 方法。”</p>

您提供的示例的 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");

使用 1080p 受保护的内容试一试。

于 2015-12-16T20:11:45.057 回答