Präsentationsdeskriptoren
Eine Präsentation ist eine Gruppe verwandter Medienstreams, die sich eine gemeinsame Präsentationszeit teilen. Beispielsweise kann eine Präsentation aus den Audio- und Videostreams eines Films bestehen. Ein Präsentationsdeskriptor ist ein Objekt, das die Beschreibung einer bestimmten Präsentation enthält. Präsentationsdeskriptoren werden verwendet, um Medienquellen und einige Mediensenken zu konfigurieren.
Jeder Präsentationsdeskriptor enthält eine Liste mit mindestens einem Streamdeskriptor. Diese beschreiben die Streams in der Präsentation. Streams können entweder ausgewählt oder deaktiviert werden. Nur die ausgewählten Datenströme erzeugen Daten. Deaktivierte Streams sind nicht aktiv und erzeugen keine Daten. Jeder Streamdeskriptor verfügt über einen Medientyphandler, der verwendet wird, um den Medientyp des Datenstroms zu ändern oder den aktuellen Medientyp des Datenstroms abzurufen. (Weitere Informationen zu Medientypen finden Sie unter Medientypen.)
Die folgende Tabelle zeigt die primären Schnittstellen, die jedes dieser Objekte verfügbar macht.
Object | Schnittstelle |
---|---|
Präsentationsdeskriptor | IMFPresentationDescriptor |
Streamdeskriptor | IMFStreamDescriptor |
Medientyphandler | IMFMediaTypeHandler |
Medienquellenpräsentationen
Jede Medienquelle stellt einen Präsentationsdeskriptor bereit, der die Standardkonfiguration für die Quelle beschreibt. In der Standardkonfiguration ist mindestens ein Stream ausgewählt, und jeder ausgewählte Datenstrom verfügt über einen Medientyp. Um den Präsentationsdeskriptor abzurufen, rufen Sie IMFMediaSource::CreatePresentationDescriptor auf. Die -Methode gibt einen IMFPresentationDescriptor-Zeiger zurück.
Sie können den Präsentationsdeskriptor der Quelle ändern, um einen anderen Datenstromsatz auszuwählen. Ändern Sie den Präsentationsdeskriptor nur, wenn die Medienquelle beendet wurde. Die Änderungen werden angewendet, wenn Sie IMFMediaSource::Start aufrufen, um die Quelle zu starten.
Um die Anzahl der Streams abzurufen, rufen Sie IMFPresentationDescriptor::GetStreamDescriptorCount auf. Um den Streamdeskriptor für einen Stream abzurufen, rufen Sie IMFPresentationDescriptor::GetStreamDescriptorByIndex auf, und übergeben Sie den Index des Datenstroms. Streams werden ab 0 (null) indiziert. Die GetStreamDescriptorByIndex-Methode gibt einen IMFStreamDescriptor-Zeiger zurück. Außerdem wird ein boolesches Flag zurückgegeben, das angibt, ob der Stream ausgewählt ist. Wenn der Stream ausgewählt ist, erzeugt die Medienquelle Daten für diesen Datenstrom. Andernfalls erzeugt die Quelle keine Daten für diesen Stream. Um einen Stream auszuwählen, rufen Sie IMFPresentationDescriptor::SelectStream mit dem Index des Datenstroms auf. Um die Auswahl eines Streams aufzuheben, rufen Sie IMFPresentationDescriptor::D eselectStream auf.
Der folgende Code zeigt, wie Sie den Präsentationsdeskriptor aus einer Medienquelle abrufen und die Streams auflisten.
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
Medientyphandler
Um den Medientyp des Datenstroms zu ändern oder den aktuellen Medientyp des Datenstroms abzurufen, verwenden Sie den Medientyphandler des Datenstromdeskriptors. Rufen Sie IMFStreamDescriptor::GetMediaTypeHandler auf, um den Medientyphandler abzurufen. Diese Methode gibt einen IMFMediaTypeHandler-Zeiger zurück.
Wenn Sie einfach wissen möchten, welche Art von Daten im Stream enthalten sind, z. B. Audio oder Video, rufen Sie IMFMediaTypeHandler::GetMajorType auf. Diese Methode gibt die GUID für den Hauptmedientyp zurück. Beispielsweise verbindet eine Wiedergabeanwendung in der Regel einen Audiodatenstrom mit dem Audiorenderer und einen Videostream mit dem Videorenderer. Wenn Sie die Mediensitzung oder den Topologieladeprogramm zum Erstellen einer Topologie verwenden, ist die Haupttyp-GUID möglicherweise die einzigen Formatinformationen, die Sie benötigen.
Wenn Ihre Anwendung ausführlichere Informationen zum aktuellen Format benötigt, rufen Sie IMFMediaTypeHandler::GetCurrentMediaType auf. Diese Methode gibt einen Zeiger auf die IMFMediaType-Schnittstelle des Medientyps zurück. Verwenden Sie diese Schnittstelle, um die Details des Formats abzurufen.
Der Medientyphandler enthält auch eine Liste der unterstützten Medientypen für den Stream. Um die Größe der Liste abzurufen, rufen Sie IMFMediaTypeHandler::GetMediaTypeCount auf. Um einen Medientyp aus der Liste abzurufen, rufen Sie IMFMediaTypeHandler::GetMediaTypeByIndex mit dem Index des Medientyps auf. Medientypen werden in der ungefähren Reihenfolge der Einstellung zurückgegeben. Beispielsweise werden bei Audioformaten höhere Abtastraten gegenüber niedrigeren Abtastraten bevorzugt. Es gibt jedoch keine endgültige Regel, die die Reihenfolge regelt, daher sollten Sie sie einfach als Richtlinie behandeln.
Die Liste der unterstützten Typen enthält möglicherweise nicht alle möglichen Medientypen, die vom Stream unterstützt werden. Um zu testen, ob ein bestimmter Medientyp unterstützt wird, rufen Sie IMFMediaTypeHandler::IsMediaTypeSupported auf. Um den Medientyp festzulegen, rufen Sie IMFMediaTypeHandler::SetCurrentMediaType auf. Wenn die Methode erfolgreich ist, enthält der Stream Daten, die dem angegebenen Format entsprechen. Die SetCurrentMediaType-Methode ändert die Liste der bevorzugten Typen nicht.
Der folgende Code zeigt, wie Sie den Medientyphandler abrufen, die bevorzugten Medientypen auflisten und den Medientyp festlegen. In diesem Beispiel wird davon ausgegangen, dass die Anwendung über einen Algorithmus verfügt, der hier nicht gezeigt wird, um den Medientyp auszuwählen. Die Besonderheiten hängen stark von Ihrer Anwendung ab.
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
Zugehörige Themen