手順 3: メディア ファイルを開く
このトピックは、 Media Foundation を使用してメディア ファイルを再生する方法に関するチュートリアルの手順 3 です。 完全なコードは、「 メディア セッション再生の例」のトピックに示されています。
メソッドは CPlayer::OpenURL
、URL からメディア ファイルを開きます。
// Open a URL for playback.
HRESULT CPlayer::OpenURL(const WCHAR *sURL)
{
// 1. Create a new media session.
// 2. Create the media source.
// 3. Create the topology.
// 4. Queue the topology [asynchronous]
// 5. Start playback [asynchronous - does not happen in this method.]
IMFTopology *pTopology = NULL;
IMFPresentationDescriptor* pSourcePD = NULL;
// Create the media session.
HRESULT hr = CreateSession();
if (FAILED(hr))
{
goto done;
}
// Create the media source.
hr = CreateMediaSource(sURL, &m_pSource);
if (FAILED(hr))
{
goto done;
}
// Create the presentation descriptor for the media source.
hr = m_pSource->CreatePresentationDescriptor(&pSourcePD);
if (FAILED(hr))
{
goto done;
}
// Create a partial topology.
hr = CreatePlaybackTopology(m_pSource, pSourcePD, m_hwndVideo, &pTopology);
if (FAILED(hr))
{
goto done;
}
// Set the topology on the media session.
hr = m_pSession->SetTopology(0, pTopology);
if (FAILED(hr))
{
goto done;
}
m_state = OpenPending;
// If SetTopology succeeds, the media session will queue an
// MESessionTopologySet event.
done:
if (FAILED(hr))
{
m_state = Closed;
}
SafeRelease(&pSourcePD);
SafeRelease(&pTopology);
return hr;
}
このメソッドは、次の手順を実行します。
- CPlayer::CreateSession を呼び出して、メディア セッションの新しいインスタンスを作成します。 「手順 4: メディア セッションを作成する」を参照してください。
- URL からメディア ソースを作成します。 この手順の完全なコードについては、「 ソース リゾルバーの使用」のトピックを参照してください。
- IMFMediaSource::CreatePresentationDescriptor を呼び出して、メディア ソースのプレゼンテーション記述子を取得します。 プレゼンテーション記述子は、ソース ファイル内の各ストリームを記述します。
- 再生トポロジを作成します。 この手順のコードは、「 再生トポロジの作成」のトピックに示されています。
- IMFMediaSession::SetTopology を呼び出して、メディア セッションでトポロジを設定します。
SetTopology メソッドは非同期的に完了します。 完了すると、CPlayer オブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。 「手順 5: メディア セッション イベントを処理する」を参照してください。
関連トピック