Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird beschrieben, wie Sie die Sequenzquelle verwenden, um eine Abfolge von Dateien wiederzugeben.
Überblick
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 Sequenzerquelle stellt eine nahtlose Wiedergabe sicher, 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 schnell starten, wenn sie erforderlich ist.
Die Mediensitzung ist für das Einfüttern 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 Sequenzerquelle Topologien verwaltet, finden Sie unter "Informationen zur Sequenzerquelle".
Diese Anleitung enthält die folgenden Schritte:
- Voraussetzungen
- Media Foundation initialisieren
- Erstellen von Media Foundation-Objekten
- Erstellen der Medienquelle
- Erstellen teilweiser Topologien
- Hinzufügen von Topologien zur Sequenzerquelle
- Festlegen der ersten Topologie für die Mediensitzung
- Warteschlange der nächsten Topologie in der Mediensitzung
- Freigeben der Sequenzerquelle
Die Codebeispiele in diesem Thema sind Auszüge aus der Quelle Sequencer-Beispielcode, die den vollständigen Beispielcode enthält.
Voraussetzungen
Bevor Sie mit diesem exemplarischem Einstieg beginnen, machen Sie sich mit den folgenden Media Foundation-Konzepten vertraut:
Lesen Sie außerdem , wie Mediendateien mit Media Foundation wiedergegeben werden, da der hier gezeigte Beispielcode den Code in diesem Thema erweitert.
Initialisieren der Media Foundation
Bevor Sie media Foundation-Schnittstellen oder -Methoden verwenden können, initialisieren Sie Media Foundation, indem Sie die MFStartup-Funktion aufrufen. Weitere Informationen erhalten Sie im Abschnitt Einrichten 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.
- Sequenzerquelle. Dieses Objekt macht die IMFSequencerSource-Schnittstelle verfügbar, die Methoden zum Hinzufügen, Aktualisieren und Löschen von Topologien in einer Sequenz bereitstellt.
- Rufen Sie die MFCreateMediaSession-Funktion auf, um die Mediensitzung zu erstellen.
- Rufen Sie IMFMediaEventQueue::BeginGetEvent auf, um das erste Ereignis aus der Mediensitzung anzufordern.
- Rufen Sie die MFCreateSequencerSource-Funktion auf, um die Sequenzerquelle 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 dazu die MFCreateSourceResolver-Funktion auf, um einen Quelllöser zu erstellen, und rufen Sie dann die IMFSourceResolver::CreateObjectFromURL-Methode auf, um die Medienquelle zu erstellen.
Informationen zu Medienquellen finden Sie unter "Medienquellen".
Erstellen teilweiser Topologien
Jedes Segment in der Sequenzerquelle verfügt über eine eigene Partialtopologie. Erstellen Sie als Nächstes Teiltopologien für Medienquellen. Bei einer partiellen Topologie sind die Topologiequellknoten direkt mit den Ausgabeknoten verbunden, ohne Zwischentransformationen anzugeben. Die Mediensitzung verwendet das Topologieladeobjekt, um die Topologie zu entschlüsseln. Nachdem eine Topologie aufgelöst wurde, werden die erforderlichen Decoder und andere Transformationsknoten hinzugefügt. Die Sequenzerquelle kann auch vollständige Topologien enthalten.
Verwenden Sie zum Erstellen des Topologieobjekts die MFCreateTopology-Funktion und dann die IMFTopologyNode-Schnittstelle , um Datenstromknoten 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 ursprünglichen Quelle wiedergeben, indem sie den Quellknoten konfigurieren. Legen Sie dazu das attribut MF_TOPONODE_MEDIASTART und das attribut MF_TOPONODE_MEDIASTOP auf MF_TOPOLOGY_SOURCESTREAM_NODE Topologieknoten fest. Geben Sie die Medienanfangszeit und die Medienstoppzeit relativ zum Start der systemeigenen Quelle als UINT64-Typen an.
Hinzufügen von Topologien zur Sequenzerquelle
Fügen Sie als Nächstes der Sequenzerquelle die von Ihnen erstellten Teiltopologien hinzu. Jedem Sequenzelement, das als Segment bezeichnet wird, wird ein MFSequencerElementId-Bezeichner zugewiesen. Weitere Informationen dazu, wie die Sequenzerquelle Topologien verwaltet, finden Sie unter "Informationen zur Sequenzerquelle".
Nachdem alle Topologien der Sequenzerquelle 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 Sequenzerquelle, dass weitere Topologien hinzugefügt werden.
Rufen Sie die IMFSequencerSource::AppendTopology-Methode auf, um der Sequenzerquelle 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 Sequenzerquelle ist, übergeben Sie SequencerTopologyFlags_Last im dwFlags-Parameter. Dieser Wert wird in der MFSequencerTopologyFlags-Aufzählung definiert.
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 Sequenzer ist. (Dieser Aufruf ist optional, wenn die letzte Topologie im AppendTopology-Aufruf angegeben wird.)
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 aufrufen und die neue Topologie in pTopology übergeben. Wenn in der neuen Topologie neue systemeigene Quellen vorhanden sind, werden die Quellen dem Quellcache hinzugefügt. Die Preroll-Liste wird ebenfalls aktualisiert.
Festlegen der ersten Topologie für die Mediensitzung
Als Nächstes stelle die erste Topologie der Sequenzquelle in der Mediensitzung in die Warteschlange. Um die erste Topologie aus der Sequenzerquelle 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 teilweisen Topologien finden Sie unter "Informationen zu Topologien".
Rufen Sie die ursprüngliche Medienquelle für die erste Topologie der Sequenzquelle ab.
Erstellen Sie einen Präsentationsdeskriptor für die Medienquelle, indem Sie die IMFMediaSource::CreatePresentationDescriptor-Methode aufrufen.
Rufen Sie die zugeordnete Topologie für die Präsentation ab, indem Sie die IMFMediaSourceTopologyProvider::GetMediaSourceTopology-Methode aufrufen.
Legen Sie die erste Topologie für die Mediensitzung durch Aufrufen von IMFMediaSession::SetTopology fest.
Rufen Sie SetTopology auf, wobei der parameter dwSetTopologyFlags auf NULL festgelegt ist. Dadurch wird die Mediensitzung angewiesen, die spezifizierte Topologie zu starten, wenn die aktuelle Topologie vollständig ist. Da in diesem Fall die angegebene Topologie die erste Topologie ist und keine aktuelle Präsentation vorhanden ist, startet die Mediensitzung die neue Präsentation sofort.
Der NULL-Wert gibt auch an, dass die Mediensitzung 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;
}
Warteschlange der nächsten Topologie in der Mediensitzung
Als Nächstes muss die Anwendung das MENewPresentation-Ereignis behandeln.
Sequenzerquelle löst MENewPresentation aus, wenn die Mediensitzung mit der Wiedergabe eines Segments beginnt, das einem anderen Segment folgt. Dieses Ereignis informiert die Anwendung über die nächste Topologie in der Quellsequenz, indem der Präsentationsdeskriptor für das nächste Segment in der Pre-Roll-Liste bereitgestellt wird. Die Anwendung muss die zugeordnete Topologie mithilfe des Topologieanbieters abrufen und in der Mediensitzung in die Warteschlange stellen. Die Sequenzerquelle bereitet dann diese Topologie vor, wodurch ein nahtloser Übergang zwischen Präsentationen gewährleistet wird.
Wenn die Anwendung segmentübergreifend sucht, empfängt die Anwendung mehrere MENewPresentation-Ereignisse , während die Sequenzerquelle die Prerollliste aktualisiert und die richtige Topologie einrichtet. Die Anwendung muss jedes Ereignis verarbeiten und die in den Ereignisdaten zurückgegebene Topologie in der Medien-Sitzung in die Warteschlange stellen. Informationen zum Überspringen von Segmenten finden Sie unter Verwenden der Sequenzerquelle.
Informationen zum Abrufen von Sequenzerquellbenachrichtigungen finden Sie unter Sequencer Source Events.
Rufen Sie im MENewPresentation-Ereignishandler den Präsentationsdeskriptor für das nächste Segment aus den Ereignisdaten ab.
Rufen Sie die zugeordnete Topologie für die Präsentation ab, indem Sie die IMFMediaSourceTopologyProvider::GetMediaSourceTopology-Methode aufrufen.
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 Sequenzerquelle
Beenden Sie schließlich die Sequenzerquelle. Rufen Sie dazu die IMFMediaSource::Shutdown-Methode für die Sequenzerquelle auf. Dieser Aufruf beendet alle zugrunde liegenden systemeigenen Medienquellen in der Sequenzerquelle.
Nach dem Freigeben der Sequenzerquelle sollte die Anwendung die Mediensitzung schließen und herunterfahren, indem IMFMediaSession::Close und IMFMediaSession::Shutdown in dieser Reihenfolge aufgerufen wird.
Um Speicherverluste zu vermeiden, muss die Anwendung Zeiger auf Media Foundation-Schnittstellen freigeben, wenn sie nicht mehr benötigt werden.
Nächste Schritte
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Sie mithilfe der Sequenzquelle eine einfache Wiedergabeliste erstellen. Nachdem Sie die Wiedergabeliste erstellt haben, möchten Sie möglicherweise erweiterte Features wie Segmentsprung, Ändern des Wiedergabezustands und Suchen in einem Segment hinzufügen. Die folgende Liste enthält Links zu den verwandten Themen:
- Steuern von Präsentationszuständen: Die Sequenzerquelle basiert auf der Mediensitzung, um Transportsteuerelemente wie "Wiedergabe", "Anhalten" und "Beenden" bereitzustellen.
- Wie man ein Scrubbing durchführt beschreibt die Schritte, die erforderlich sind, um eine bestimmte Position in einem Stream anzusteuern.
Zugehörige Themen