次の方法で共有


手順 2: CPlayer オブジェクトを作成する

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

クラスの CPlayer インスタンスを作成するために、アプリケーションは静的 CPlayer::CreateInstance メソッドを呼び出します。 このメソッドは、次のパラメーターを受け取ります。

  • hVideo は 、ビデオを表示するウィンドウを指定します。
  • hEvent は 、イベントを受信するウィンドウを指定します。 両方のウィンドウ ハンドルに同じハンドルを渡すことが有効です。
  • ppPlayer は 、新しい CPlayer インスタンスへのポインターを受け取ります。

CreateInstance メソッドのコードを次に示します。

//  Static class method to create the CPlayer object.

HRESULT CPlayer::CreateInstance(
    HWND hVideo,                  // Video window.
    HWND hEvent,                  // Window to receive notifications.
    CPlayer **ppPlayer)           // Receives a pointer to the CPlayer object.
{
    if (ppPlayer == NULL)
    {
        return E_POINTER;
    }

    CPlayer *pPlayer = new (std::nothrow) CPlayer(hVideo, hEvent);
    if (pPlayer == NULL)
    {
        return E_OUTOFMEMORY;
    }

    HRESULT hr = pPlayer->Initialize();
    if (SUCCEEDED(hr))
    {
        *ppPlayer = pPlayer;
    }
    else
    {
        pPlayer->Release();
    }
    return hr;
}

HRESULT CPlayer::Initialize()
{
    // Start up Media Foundation platform.
    HRESULT hr = MFStartup(MF_VERSION);
    if (SUCCEEDED(hr))
    {
        m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (m_hCloseEvent == NULL)
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
    }
    return hr;
}

次のコードは、コンストラクターを CPlayer 示しています。

CPlayer::CPlayer(HWND hVideo, HWND hEvent) : 
    m_pSession(NULL),
    m_pSource(NULL),
    m_pVideoDisplay(NULL),
    m_hwndVideo(hVideo),
    m_hwndEvent(hEvent),
    m_state(Closed),
    m_hCloseEvent(NULL),
    m_nRefCount(1)
{
}

コンストラクターは次の処理を行います。

  1. MFStartup を呼び出して Media Foundation プラットフォームを初期化します。
  2. 自動リセット イベントを作成します。 このイベントは、メディア セッションを閉じるときに使用されます。 「手順 7: メディア セッションをシャットダウンする」を参照してください。

「手順 7: メディア セッションをシャットダウンする」の説明に従って、デストラクター によってメディア セッションがシャットダウンされます。

CPlayer::~CPlayer()
{
    assert(m_pSession == NULL);  
    // If FALSE, the app did not call Shutdown().

    // When CPlayer calls IMediaEventGenerator::BeginGetEvent on the
    // media session, it causes the media session to hold a reference 
    // count on the CPlayer. 
    
    // This creates a circular reference count between CPlayer and the 
    // media session. Calling Shutdown breaks the circular reference 
    // count.

    // If CreateInstance fails, the application will not call 
    // Shutdown. To handle that case, call Shutdown in the destructor. 

    Shutdown();
}

コンストラクターとデストラクターはどちらも保護されたクラス メソッドであることに注意してください。 アプリケーションは、静的 CreateInstance メソッドを使用して オブジェクトを作成します。 明示的に delete を使用するのではなく、IUnknown::Release を呼び出してオブジェクトを破棄します。

次へ: 手順 3: メディア ファイルを開く

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

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