gpt4 book ai didi

c++ - IMFMediaEngine 始终使用 DirectComposition 以 640x480 运行

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:40 25 4
gpt4 key购买 nike

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

使用 TransferVideoFrame 将视频绘制到纹理上效果非常好。但我知道 PlayReady + DRM + 1080p 视频需要使用 DirectComposition。所以我正在努力让它发挥作用。

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

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

我正在以这种方式注册 Visual:

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 表面,所以必须有一种方法来实现它。

最佳答案

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

对于 protected 内容,调用此方法而不是 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");

尝试使用 1080p protected 内容。

关于c++ - IMFMediaEngine 始终使用 DirectComposition 以 640x480 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34095779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com