Schritt 2: Erstellen des CPlayer-Objekts

Dieses Thema ist Schritt 2 des Tutorials Zum Wiedergeben von Mediendateien mit Media Foundation. Den vollständigen Code finden Sie im Thema Mediensitzungswiedergabebeispiel.

Um eine instance der CPlayer -Klasse zu erstellen, ruft die Anwendung die statische CPlayer::CreateInstance Methode auf. Diese Methode verwendet die folgenden Parameter:

  • hVideo gibt das Fenster an, in dem Video angezeigt werden soll.
  • hEvent gibt ein Fenster zum Empfangen von Ereignissen an. Es ist gültig, dasselbe Handle für beide Fensterhandles zu übergeben.
  • ppPlayer empfängt einen Zeiger auf eine neue CPlayer instance.

Der folgende Code veranschaulicht die CreateInstance-Methode:

//  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;
}

Der folgende Code zeigt den CPlayer Konstruktor:

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)
{
}

Der Konstruktor führt folgendes aus:

  1. Ruft MFStartup auf , um die Media Foundation-Plattform zu initialisieren.
  2. Erstellt ein Ereignis zum automatischen Zurücksetzen. Dieses Ereignis wird beim Schließen der Mediensitzung verwendet. Siehe Schritt 7: Herunterfahren der Mediensitzung.

Der Destruktor beendet die Mediensitzung, wie in Schritt 7: Herunterfahren der Mediensitzung beschrieben.

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

Beachten Sie, dass der Konstruktor und der Destruktor beide Methoden der geschützten Klasse sind. Die Anwendung erstellt das Objekt mithilfe der statischen CreateInstance Methode. Das Objekt wird zerstört, indem IUnknown::Release aufgerufen wird, anstatt explizit delete zu verwenden.

Weiter: Schritt 3: Öffnen einer Mediendatei

Audio-/Videowiedergabe

Wiedergeben von Mediendateien mit Media Foundation