- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我希望将直接合成渲染到纹理。这可能吗? 这样做的原因是我希望能够将 gpu 加速的无窗口透明 flash 播放器 activex 控件渲染到纹理。通常不可能实现的事情,但我希望通过 DirectCom
我正在使用 IMFMediaEngine 播放视频流(Smooth Streaming,HLS),稍后可能会使用 PlayReady。 使用 TransferVideoFrame 将视频绘制到纹理上效
我是一名优秀的程序员,十分优秀!