IMFMediaEngineを使用してビデオストリーム(Smooth Streaming、HLS)を再生し、後でPlayReadyを使用する可能性があります。
TransferVideoFrameを使用してビデオをテクスチャに描画すると、すばらしい働きをします。ただし、DirectCompositionを使用するには、PlayReady + DRM + 1080pビデオが必要であることを理解しています。だから私はこれを機能させようとしています。
また、この方法のもう1つの利点は、ビデオフレームのレンダリングがアプリから独立しているため、アプリの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
事前にサーフェスを作成しようとしても、ビジュアルでSetContentは何も変更されません。これは、ビデオプレーヤーが独自のサーフェス640x480でオーバーライドするようなものです。単純なプレーヤーに固執し、この問題の実際の解決策を見つけて、MF_MEDIA_ENGINE_EVENT_FORMATCHANGEイベントを受け取ったときにVisualSurfaceのサイズを指定できると本当に便利です。
これは、DirectCompositionサーフェスを指定するためのIMFMediaEngineのオプションであるため、これを機能させる方法が必要です。
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");
1080pで保護されたコンテンツでこれを試してみてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加