基本的な使用法については、サンプルコードを基にMedia Sessionによる再生方法で解説します。
アプリケーションのプロセスで、Media Sessionを作成できます。
HRESULT MFCreateMediaSession( IMFAttributes *pConfiguration, IMFMediaSession **ppMediaSession );MFCreateMediaSession function | Microsoft Learn
Media SessionにTopologyを設定できます。
HRESULT SetTopology( DWORD dwSetTopologyFlags, IMFTopology *pTopology );IMFMediaSession::SetTopology (mfidl.h) | Microsoft Learn
Media SessionからTopologyを取得できます。このメソッドは、現在のトポロジまたはキューに入れられたトポロジから取得します。
HRESULT GetFullTopology( DWORD dwGetFullTopologyFlags, // TOPOID TopoId, // Topologyの識別子。dwGetFullTopologyFlagsがMFSESSION_GETFULLTOPOLOGY_CURRENTを含むときは、無視される IMFTopology **ppFullTopology );IMFMediaSession::GetFullTopology (mfidl.h) | Microsoft Learn
IMFTopology *pTopology; pMediaSession->GetFullTopology(MFSESSION_GETFULLTOPOLOGY_CURRENT, 0, &pTopology);
Media Sessionを指定位置から開始できます。
HRESULT Start(
const GUID *pguidTimeFormat, // pvarStartPositionが表す時間の書式
const PROPVARIANT *pvarStartPosition
);
IMFMediaSession::Start | Microsoft Learn
このメソッドが呼び出されたとき、Media SessionはPresentation Clockを開始し、Media Sampleの処理を開始します。
値 | |
---|---|
GUID_NULL | Presentation time。pvarStartPositionで次のいずれかを指定する
|
NULL | |
MF_TIME_FORMAT_SEGMENT_OFFSET | セグメントのオフセット |
MF_TIME_FORMAT_ENTRY_RELATIVE | 現在の位置から飛び越えるプレイリストの位置 |
PROPVARIANT varStartPosition;
PropVariantInit(&varStartPosition);
varStartPosition.vt = VT_I8;
varStartPosition.hVal.QuadPart = 10000000; // 1秒 (10000000[100nsec]) の位置から再生する
HRESULT hr = pMediaSession->Start(NULL, &varStartPosition);
PropVariantClear(&varStartPosition);
Start()は非同期で処理されるため、連続して呼び出されるとそれが順に処理されることになります。よってMESessionStartedイベントで再生が開始されたことを確認してから、最新の要求だけを処理するようにします。Seeking, Fast Forward, and Reverse Play - Win32 apps | Microsoft Learn
一時停止の状態でもStart()を呼ぶと再生が開始されてしまいます。これを再生位置の変更だけとするには、再生割合 (再生速度) をゼロとしてからStart()を呼びます。How to Perform Scrubbing - Win32 apps | Microsoft Learn
再生位置を設定するのではなく取得するには、IMFPresentationClock::GetTime()を呼びます。How to get the current playback position ?
HRESULT Pause();IMFMediaSession::Pause (mfidl.h) | Microsoft Learn
このメソッドはPresentation Clockを休止します。Media Sessionが停止しているとき、このメソッドは失敗します。
Media Sessionを閉じ、使用されているすべてのリソースを解放できます。
HRESULT Close();IMFMediaSession::Close (mfidl.h) - Win32 apps | Microsoft Learn
このメソッドは非同期で処理され、処理が完了したときにMESessionClosedイベントが送られます。
Media Sessionをシャットダウンし、Media Sessionで使用されているすべてのリソースを解放できます。
HRESULT Shutdown();IMFMediaSession::Shutdown (mfidl.h) - Win32 apps | Microsoft Learn
Media Sessionの使用が終わり、最後にIUnknown::Release()を呼ぶ前に、このメソッドを呼びます。このメソッドを呼ばないと、アプリケーションでメモリリークが発生します。