Freigeben über


Erstellen einer Wiedergabeliste

In diesem Thema wird beschrieben, wie Sie die Sequenzquelle verwenden, um eine Sequenz von Dateien wiederzugeben.

Übersicht

Um Mediendateien in einer Sequenz wiederzugeben, muss die Anwendung Topologien in einer Sequenz hinzufügen, um eine Wiedergabeliste zu erstellen, und diese Topologien in der Mediensitzung für die Wiedergabe in die Warteschlange stellen.

Die Sequencerquelle sorgt für eine nahtlose Wiedergabe, indem die nächste Topologie initialisiert und geladen wird, bevor die Mediensitzung mit der Wiedergabe der aktuellen Topologie beginnt. Dadurch kann die Anwendung die nächste Topologie bei Bedarf schnell starten.

Die Mediensitzung ist für die Zufuhr von Daten an die Senken und die Wiedergabe der Topologien in der Sequenzquelle verantwortlich. Darüber hinaus verwaltet die Mediensitzung die Präsentationszeit für die Segmente.

Weitere Informationen dazu, wie die Sequencerquelle Topologien verwaltet, finden Sie unter Informationen zur Sequencerquelle.

Diese exemplarische Vorgehensweise enthält die folgenden Schritte:

  1. Voraussetzungen
  2. Initialisieren von Media Foundation
  3. Erstellen von Media Foundation-Objekten
  4. Erstellen der Medienquelle
  5. Erstellen partieller Topologien
  6. Hinzufügen von Topologien zur Sequencerquelle
  7. Festlegen der ersten Topologie für die Mediensitzung
  8. Warteschlangen für die nächste Topologie in der Mediensitzung
  9. Freigeben der Sequencerquelle

Die in diesem Thema gezeigten Codebeispiele sind Auszüge aus dem Thema Sequencer Source Example Code, der den vollständigen Beispielcode enthält.

Voraussetzungen

Bevor Sie mit dieser exemplarische Vorgehensweise beginnen, machen Sie sich mit den folgenden Media Foundation-Konzepten vertraut:

Lesen Sie auch Wiedergeben von Mediendateien mit Media Foundation, da der Beispielcode shwon hier den Code in diesem Thema erweitert.

Initialisieren von Media Foundation

Bevor Sie Media Foundation-Schnittstellen oder -Methoden verwenden können, initialisieren Sie Media Foundation, indem Sie die MFStartup-Funktion aufrufen. Weitere Informationen finden Sie unter Initialisieren von Media Foundation.

    hr = MFStartup(MF_VERSION);

Erstellen von Media Foundation-Objekten

Erstellen Sie als Nächstes die folgenden Media Foundation-Objekte:

  • Mediensitzung. Dieses Objekt macht die IMFMediaSession-Schnittstelle verfügbar, die Methoden zum Wiedergeben, Anhalten und Beenden der aktuellen Topologie bereitstellt.
  • Sequencerquelle. Dieses Objekt macht die IMFSequencerSource-Schnittstelle verfügbar, die Methoden zum Hinzufügen, Aktualisieren und Löschen von Topologien in einer Sequenz bereitstellt.
  1. Rufen Sie die MFCreateMediaSession-Funktion auf, um die Mediensitzung zu erstellen.
  2. Rufen Sie IMFMediaEventQueue::BeginGetEvent auf, um das erste Ereignis von der Mediensitzung anzufordern.
  3. Rufen Sie die MFCreateSequencerSource-Funktion auf, um die Sequencerquelle zu erstellen.

Der folgende Code erstellt die Mediensitzung und fordert das erste Ereignis an:

//  Create a new instance of the media session.
HRESULT CPlayer::CreateSession()
{
    // Close the old session, if any.
    HRESULT hr = CloseSession();
    if (FAILED(hr))
    {
        goto done;
    }

    assert(m_state == Closed);

    // Create the media session.
    hr = MFCreateMediaSession(NULL, &m_pSession);
    if (FAILED(hr))
    {
        goto done;
    }

    // Start pulling events from the media session
    hr = m_pSession->BeginGetEvent((IMFAsyncCallback*)this, NULL);
    if (FAILED(hr))
    {
        goto done;
    }

    m_state = Ready;

done:
    return hr;
}

Erstellen der Medienquelle

Erstellen Sie als Nächstes eine Medienquelle für das erste Wiedergabelistensegment. Verwenden Sie den Quelllöser , um eine Medienquelle aus einer URL zu erstellen. Rufen Sie hierzu die MFCreateSourceResolver-Funktion auf, um einen Quellresolver zu erstellen, und rufen Sie dann die IMFSourceResolver::CreateObjectFromURL-Methode auf, um die Medienquelle zu erstellen.

Informationen zu Medienquellen finden Sie unter Medienquellen.

Erstellen partieller Topologien

Jedes Segment in der Sequencerquelle verfügt über eine eigene partielle Topologie. Erstellen Sie als Nächstes partielle Topologien für Medienquellen. Bei einer partiellen Topologie werden die Topologiequellknoten direkt mit den Ausgabeknoten verbunden, ohne Zwischentransformationen anzugeben. Die Mediensitzung verwendet das Topologieladeprogrammobjekt, um die Topologie aufzulösen. Nachdem eine Topologie aufgelöst wurde, werden die erforderlichen Decoder und andere Transformationsknoten hinzugefügt. Die Sequencerquelle kann auch vollständige Topologien enthalten.

Verwenden Sie zum Erstellen des Topologieobjekts die MFCreateTopology-Funktion und dann die IMFTopologyNode-Schnittstelle , um Streamknoten zu erstellen.

Vollständige Anweisungen zur Verwendung dieser Programmierelemente zum Erstellen von Topologien finden Sie unter Erstellen von Wiedergabetopologien.

Eine Anwendung kann einen ausgewählten Teil der nativen Quelle wiedergeben, indem sie den Quellknoten konfiguriert. Legen Sie hierzu das Attribut MF_TOPONODE_MEDIASTART und das Attribut MF_TOPONODE_MEDIASTOP auf MF_TOPOLOGY_SOURCESTREAM_NODE Topologieknoten fest. Geben Sie die Medienstartzeit und die Medienstoppzeit relativ zum Start der nativen Quelle als UINT64-Typen an.

Hinzufügen von Topologien zur Sequencerquelle

Fügen Sie als Nächstes der Sequencerquelle die von Ihnen erstellten Teiltopologien hinzu. Jedem Sequenzelement, das als Segment bezeichnet wird, wird ein MFSequencerElementId-Bezeichner zugewiesen. Weitere Informationen dazu, wie die Sequencerquelle Topologien verwaltet, finden Sie unter Informationen zur Sequencerquelle.

Nachdem alle Topologien der Sequencerquelle hinzugefügt wurden, muss die Anwendung das letzte Segment in der Sequenz kennzeichnen, um die Wiedergabe in der Pipeline zu beenden. Ohne dieses Flag erwartet die Sequencerquelle, dass weitere Topologien hinzugefügt werden.

  1. Rufen Sie die IMFSequencerSource::AppendTopology-Methode auf, um der Sequencerquelle eine bestimmte Topologie hinzuzufügen.

        hr = m_pSequencerSource->AppendTopology(
            pTopology, 
            SequencerTopologyFlags_Last, 
            &SegmentId
            );
    

    AppendTopology fügt der Sequenz die angegebene Topologie hinzu. Diese Methode gibt den Segmentbezeichner im PdwId-Parameter zurück.

    Wenn die Topologie die letzte in der Sequencerquelle ist, übergeben Sie SequencerTopologyFlags_Last im dwFlags-Parameter . Dieser Wert wird in der MFSequencerTopologyFlags-Enumeration definiert.

  2. Rufen Sie IMFSequencerSource::UpdateTopologyFlags auf, um die Flags für die Topologie zu aktualisieren, die dem Segmentbezeichner in der Eingabeliste zugeordnet ist. In diesem Fall gibt der Aufruf an, dass das angegebene Segment das letzte Segment im Sequencer ist. (Dieser Aufruf ist optional, wenn die letzte Topologie im AppendTopology-Aufruf angegeben ist.)

        BOOL bFirstSegment = (NumSegments() == 0);
    
        if (!bFirstSegment)
        {
            // Remove the "last segment" flag from the last segment.
            hr = m_pSequencerSource->UpdateTopologyFlags(LastSegment(), 0);
            if (FAILED(hr))
            {
                goto done;
            }
        }
    

Die Anwendung kann die Topologie eines Segments durch eine andere Topologie ersetzen, indem sie die IMFSequencerSource::UpdateTopology aufruft und die neue Topologie in pTopology übergibt. Wenn in der neuen Topologie neue native Quellen vorhanden sind, werden die Quellen dem Quellcache hinzugefügt. Die Prerollliste wird ebenfalls aktualisiert.

Festlegen der ersten Topologie für die Mediensitzung

Als Nächstes stellen Sie die erste Topologie in der Sequenzquelle in der Mediensitzung in die Warteschlange. Um die erste Topologie aus der Sequencerquelle abzurufen, muss die Anwendung die IMFMediaSourceTopologyProvider::GetMediaSourceTopology-Methode aufrufen. Diese Methode gibt die partielle Topologie zurück, die durch die Mediensitzung aufgelöst wird.

Informationen zu partiellen Topologien finden Sie unter Informationen zu Topologien.

  1. Rufen Sie die native Medienquelle für die erste Topologie der Sequenzquelle ab.

  2. Erstellen Sie einen Präsentationsdeskriptor für die Medienquelle, indem Sie die IMFMediaSource::CreatePresentationDescriptor-Methode aufrufen.

  3. Rufen Sie die zugeordnete Topologie für die Präsentation ab, indem Sie die IMFMediaSourceTopologyProvider::GetMediaSourceTopology-Methode aufrufen.

  4. Legen Sie die erste Topologie für die Mediensitzung fest, indem Sie IMFMediaSession::SetTopology aufrufen.

    Rufen Sie SetTopology auf, wobei der dwSetTopologyFlags-Parameter auf NULL festgelegt ist. Dadurch wird die Mediensitzung angewiesen, die angegebene Topologie zu starten, wenn die aktuelle Topologie abgeschlossen wurde. Da in diesem Fall die angegebene Topologie die erste Topologie ist und keine aktuelle Präsentation vorhanden ist, startet die Mediensitzung sofort die neue Präsentation.

    Der NULL-Wert gibt auch an, dass Media Session die Topologie auflösen muss, da die vom Topologieanbieter zurückgegebene Topologie immer eine partielle Topologie ist.

// Queues the next topology on the session.

HRESULT CPlaylist::QueueNextSegment(IMFPresentationDescriptor *pPD)
{
    IMFMediaSourceTopologyProvider *pTopoProvider = NULL;
    IMFTopology *pTopology = NULL;

    //Get the topology for the presentation descriptor
    HRESULT hr = m_pSequencerSource->QueryInterface(IID_PPV_ARGS(&pTopoProvider));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pTopoProvider->GetMediaSourceTopology(pPD, &pTopology);
    if (FAILED(hr))
    {
        goto done;
    }

    //Set the topology on the media session
    m_pSession->SetTopology(NULL, pTopology);

done:
    SafeRelease(&pTopoProvider);
    SafeRelease(&pTopology);
    return hr;
}

Warteschlangen für die nächste Topologie in der Mediensitzung

Als Nächstes muss die Anwendung das MENewPresentation-Ereignis behandeln.

Die Sequencerquelle löst MENewPresentation aus, wenn die Mediensitzung mit der Wiedergabe eines Segments beginnt, dem ein weiteres Segment folgt. Dieses Ereignis informiert die Anwendung über die nächste Topologie in der Sequenzquelle, indem der Präsentationsdeskriptor für das nächste Segment in der Prerollliste bereitgestellt wird. Die Anwendung muss die zugeordnete Topologie mithilfe des Topologieanbieters abrufen und in der Mediensitzung in die Warteschlange stellen. Die Sequencerquelle führt diese Topologie dann vor, sodass ein nahtloser Übergang zwischen Präsentationen gewährleistet ist.

Wenn die Anwendung segmentübergreifend sucht, empfängt die Anwendung mehrere MENewPresentation-Ereignisse , während die Sequencerquelle die Prerollliste aktualisiert und die richtige Topologie einrichtet. Die Anwendung muss jedes Ereignis verarbeiten und die topologie in den Ereignisdaten in der Mediensitzung in die Warteschlange stellen. Informationen zum Überspringen von Segmenten finden Sie unter Verwenden der Sequencerquelle.

Informationen zum Abrufen von Sequenzerquellbenachrichtigungen finden Sie unter Sequencer-Quellereignisse.

  1. Rufen Sie im MENewPresentation-Ereignishandler den Präsentationsdeskriptor für das nächste Segment aus den Ereignisdaten ab.

  2. Rufen Sie die zugeordnete Topologie für die Präsentation ab, indem Sie die IMFMediaSourceTopologyProvider::GetMediaSourceTopology-Methode aufrufen.

  3. Legen Sie die Topologie für die Mediensitzung fest, indem Sie die IMFMediaSession::SetTopology-Methode aufrufen.

    Die Mediensitzung startet die neue Präsentation, wenn die aktuelle Präsentation abgeschlossen wurde.

HRESULT CPlaylist::OnNewPresentation(IMFMediaEvent *pEvent)
{
    IMFPresentationDescriptor *pPD = NULL;

    HRESULT hr = GetEventObject(pEvent, &pPD);

    if (SUCCEEDED(hr))
    {
        // Queue the next segment on the media session
        hr = QueueNextSegment(pPD);
    }

    SafeRelease(&pPD);
    return hr;
}

Freigeben der Sequencerquelle

Fahren Sie schließlich die Sequencerquelle herunter. Rufen Sie hierzu die IMFMediaSource::Shutdown-Methode für die Sequencerquelle auf. Mit diesem Aufruf werden alle zugrunde liegenden nativen Medienquellen in der Sequencerquelle heruntergefahren.

Nach dem Freigeben der Sequencerquelle sollte die Anwendung die Mediensitzung schließen und herunterfahren, indem sie IMFMediaSession::Close und IMFMediaSession::Shutdown in dieser Reihenfolge aufruft.

Um Speicherverluste zu vermeiden, muss die Anwendung Zeiger auf Media Foundation-Schnittstellen freigeben, wenn sie nicht mehr benötigt werden.

Nächste Schritte

Diese exemplarische Vorgehensweise veranschaulicht, wie Sie mithilfe der Sequencerquelle eine einfache Wiedergabeliste erstellen. Nachdem Sie die Wiedergabeliste erstellt haben, können Sie erweiterte Funktionen hinzufügen, z. B. Das Überspringen von Segmenten, das Ändern des Wiedergabezustands und die Suche innerhalb eines Segments. Die folgende Liste enthält Links zu den verwandten Themen:

Sequencerquelle