次の方法で共有


手順 7: メディア セッションをシャットダウンする

このトピックは、 Media Foundation でメディア ファイルを再生する方法に関するチュートリアルの手順 7 です。 完全なコードは、「 メディア セッション再生の例」トピックに示されています。

メディア セッションをシャットダウンするには、次の手順に従います。

  1. IMFMediaSession::Close を呼び出して、現在のプレゼンテーションを閉じます。
  2. MESessionClosed イベントを待ちます。 このイベントは、メディア セッションからの最後のイベントであることが保証されます。
  3. IMFMediaSession::Shutdown を呼び出します。 この方法により、メディア セッションはリソースを解放します。
  4. 現在のメディア ソースで IMFMediaSource::Shutdown を呼び出します。

次のメソッドは、メディア セッションをシャットダウンします。 イベント ハンドル (m_hCloseEvent) を使用して 、MESessionClosed イベントを待機します。 「 手順 5: メディア セッション イベントを処理する」を参照してください。

//  Close the media session. 
HRESULT CPlayer::CloseSession()
{
    //  The IMFMediaSession::Close method is asynchronous, but the 
    //  CPlayer::CloseSession method waits on the MESessionClosed event.
    //  
    //  MESessionClosed is guaranteed to be the last event that the 
    //  media session fires.

    HRESULT hr = S_OK;

    SafeRelease(&m_pVideoDisplay);

    // First close the media session.
    if (m_pSession)
    {
        DWORD dwWaitResult = 0;

        m_state = Closing;
           
        hr = m_pSession->Close();
        // Wait for the close operation to complete
        if (SUCCEEDED(hr))
        {
            dwWaitResult = WaitForSingleObject(m_hCloseEvent, 5000);
            if (dwWaitResult == WAIT_TIMEOUT)
            {
                assert(FALSE);
            }
            // Now there will be no more events from this session.
        }
    }

    // Complete shutdown operations.
    if (SUCCEEDED(hr))
    {
        // Shut down the media source. (Synchronous operation, no events.)
        if (m_pSource)
        {
            (void)m_pSource->Shutdown();
        }
        // Shut down the media session. (Synchronous operation, no events.)
        if (m_pSession)
        {
            (void)m_pSession->Shutdown();
        }
    }

    SafeRelease(&m_pSource);
    SafeRelease(&m_pSession);
    m_state = Closed;
    return hr;
}

アプリケーションが終了する前に、メディア セッションをシャットダウンし、 MFShutdown を呼び出して Microsoft Media Foundation プラットフォームをシャットダウンします。

//  Release all resources held by this object.
HRESULT CPlayer::Shutdown()
{
    // Close the session
    HRESULT hr = CloseSession();

    // Shutdown the Media Foundation platform
    MFShutdown();

    if (m_hCloseEvent)
    {
        CloseHandle(m_hCloseEvent);
        m_hCloseEvent = NULL;
    }

    return hr;
}

オーディオ/ビデオの再生

Media Foundation でメディア ファイルを再生する方法