Präsentationsdeskriptoren

Eine Präsentation ist eine Reihe verwandter Medienströme, die eine gemeinsame Präsentationszeit teilen. Beispielsweise kann eine Präsentation aus den Audio- und Videostreams aus einem Film bestehen. Ein Präsentationsdeskriptor ist ein Objekt, das die Beschreibung einer bestimmten Präsentation enthält. Präsentationsdeskriptoren werden verwendet, um Medienquellen und einige Medien sinken zu konfigurieren.

Jeder Präsentationsdeskriptor enthält eine Liste einer oder mehrerer Datenstromdeskriptoren. Diese beschreiben die Datenströme in der Präsentation. Streams kann entweder ausgewählt oder deaktiviert werden. Nur die ausgewählten Datenströme erzeugen Daten. Der ausgewählte Datenstrom ist nicht aktiv und erzeugt keine Daten. Jeder Streamdeskriptor verfügt über einen Medientyphandler, der verwendet wird, um den Medientyp des Streams zu ändern oder den aktuellen Medientyp des Datenstroms abzurufen. (Weitere Informationen zu Medientypen finden Sie unter Medientypen.)

In der folgenden Tabelle sind die primären Schnittstellen dargestellt, die jede 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 Datenstrom ausgewählt, und jeder ausgewählte Datenstrom verfügt über einen Medientyp. Um das 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 Satz von Datenströme auszuwählen. Ändern Sie den Präsentationsdeskriptor nicht, es sei denn, die Medienquelle wird beendet. Die Änderungen werden angewendet, wenn Sie IMFMediaSource::Start zum Starten der Quelle aufrufen.

Um die Anzahl der Datenströme abzurufen, rufen Sie IMFPresentationDescriptor::GetStreamDescriptorCount auf. Um den Streamdeskriptor für einen Stream abzurufen, rufen Sie IMFPresentationDescriptor::GetStreamDescriptorByIndex auf und übergeben sie im Index des Datenstroms. Streams werden von Null indiziert. Die GetStreamDescriptorByIndex-Methode gibt einen IMFStreamDescriptor-Zeiger zurück. Es gibt auch ein Boolean-Flag zurück, das angibt, ob der Stream ausgewählt ist. Wenn der Datenstrom ausgewählt ist, erzeugt die Medienquelle Daten für diesen Datenstrom. Andernfalls erzeugt die Quelle keine Daten für diesen Datenstrom. Um einen Stream auszuwählen, rufen Sie IMFPresentationDescriptor::SelectStream mit dem Index des Datenstroms auf. Um einen Stream zu deaktivieren, rufen Sie IMFPresentationDescriptor::D eselectStream auf.

Im folgenden Code wird gezeigt, wie Sie das Präsentationsdeskriptor aus einer Medienquelle abrufen und die Datenströme aufzählen.

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

Verwenden Sie zum Ändern des Medientyps des Datenstroms oder zum Abrufen des aktuellen Medientyps den Medienhandler des Datenstroms. 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 vorhanden ist, z. B. Audio oder Video, rufen Sie IMFMediaTypeHandler::GetMajorTypeHandler an. Diese Methode gibt die GUID für den Hauptmedientyp zurück. Beispielsweise verbindet eine Wiedergabeanwendung in der Regel einen Audiodatenstrom mit dem Audio renderr und einem Videostream mit dem Video renderer. Wenn Sie die Mediensitzung oder den Topologielaster verwenden, um eine Topologie zu erstellen, ist die Haupttyp-GUID möglicherweise die einzige Formatinformationen, die Sie benötigen.

Wenn Ihre Anwendung ausführlichere Informationen zum aktuellen Format benötigt, rufen Sie IMFMediaTypeHandler::GetCurrentMediaTypetype 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 für Audioformate höhere Beispielraten über niedrigere Beispielraten bevorzugt. Es gibt jedoch keine endgültige Regel, die die Reihenfolge steuert, sodass Sie es einfach als Richtlinie behandeln sollten.

Die Liste der unterstützten Typen enthält möglicherweise nicht jeden möglichen Medientyp, den der Stream unterstützt. 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 verläuft, enthält der Stream Daten, die dem angegebenen Format entsprechen. Die SetCurrentMediaType-Methode ändert die Liste der bevorzugten Typen nicht.

Im folgenden Code wird gezeigt, wie Sie den Medientyphandler abrufen, die bevorzugten Medientypen aufzählen und den Medientyp festlegen. In diesem Beispiel wird davon ausgegangen, dass die Anwendung einen Algorithmus enthält, der nicht hier angezeigt wird, um den Medientyp auszuwählen. Die Spezifischen 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);

Medienquellen

Media Foundation Platform-APIs