Media Session (IMFMediaSession)

基本的な使用法については、サンプルコードを基にMedia Sessionによる再生方法で解説します。

Media Sessionの作成

MFCreateMediaSession()

アプリケーションのプロセスで、Media Sessionを作成できます。

HRESULT MFCreateMediaSession(
  IMFAttributes   *pConfiguration,
  IMFMediaSession **ppMediaSession
);
MFCreateMediaSession function | Microsoft Learn

Topologyの設定と取得

SetTopology()

Media SessionにTopologyを設定できます。

HRESULT SetTopology(
  DWORD       dwSetTopologyFlags,
  IMFTopology *pTopology
);
IMFMediaSession::SetTopology (mfidl.h) | Microsoft Learn

GetFullTopology()

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);

再生の制御

Start()

Media Sessionを指定位置から開始できます。

HRESULT Start(
  const GUID        *pguidTimeFormat, // pvarStartPositionが表す時間の書式
  const PROPVARIANT *pvarStartPosition
);
IMFMediaSession::Start | Microsoft Learn

このメソッドが呼び出されたとき、Media SessionはPresentation Clockを開始し、Media Sampleの処理を開始します。

pguidTimeFormatの値
 
GUID_NULL Presentation time。pvarStartPositionで次のいずれかを指定する
  • VT_I8 … 最初から100nsec単位の位置
  • VT_EMPTY … 現在の位置
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 ?

Pause()

HRESULT Pause();
IMFMediaSession::Pause (mfidl.h) | Microsoft Learn

このメソッドはPresentation Clockを休止します。Media Sessionが停止しているとき、このメソッドは失敗します。

リソースの解放

Close()

Media Sessionを閉じ、使用されているすべてのリソースを解放できます。

HRESULT Close();
IMFMediaSession::Close (mfidl.h) - Win32 apps | Microsoft Learn

このメソッドは非同期で処理され、処理が完了したときにMESessionClosedイベントが送られます。

Shutdown()

Media Sessionをシャットダウンし、Media Sessionで使用されているすべてのリソースを解放できます。

HRESULT Shutdown();
IMFMediaSession::Shutdown (mfidl.h) - Win32 apps | Microsoft Learn

Media Sessionの使用が終わり、最後にIUnknown::Release()を呼ぶ前に、このメソッドを呼びます。このメソッドを呼ばないと、アプリケーションでメモリリークが発生します。

Microsoft Learnから検索