Freigeben über


Präsentationsdeskriptoren

Eine Präsentation ist eine Reihe verwandter Medienstreams, die eine gemeinsame Präsentationszeit gemeinsam nutzen. 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 Mediensenken zu konfigurieren.

Jeder Präsentationsdeskriptor enthält eine Liste mit mindestens einem Streamdeskriptoren. Diese beschreiben die Datenströme in der Präsentation. Datenströme können ausgewählt oder deaktiviert werden. Nur die ausgewählten Datenströme erzeugen Daten. Nicht ausgewählte Datenströme sind nicht aktiv und erzeugen keine Daten. Jeder Datenstromdeskriptor 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.)

In der folgenden Tabelle sind die primären Schnittstellen aufgeführt, die für jedes dieser Objekte verfügbar sind.

Objekt 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. Rufen Sie zum Abrufen der Präsentationsbeschreibung IMFMediaSource::CreatePresentationDescriptorauf. Die Methode gibt einen IMFPresentationDescriptor Zeiger zurück.

Sie können den Präsentationsdeskriptor der Quelle ändern, um einen anderen Satz von Datenströmen auszuwählen. Ändern Sie den Präsentationsdeskriptor nicht, es sei denn, die Medienquelle wird beendet. Die Änderungen werden angewendet, wenn Sie IMFMediaSource::Start aufrufen, um die Quelle zu starten.

Rufen Sie IMFPresentationDescriptor::GetStreamDescriptorCountauf, um die Anzahl der Datenströme abzurufen. Rufen Sie zum Abrufen des Datenstromdeskriptors IMFPresentationDescriptor::GetStreamDescriptorByIndex auf, und übergeben Sie den Index des Datenstroms. Datenströme werden von Null indiziert. Die GetStreamDescriptorByIndex--Methode gibt einen IMFStreamDescriptor Zeiger zurück. Außerdem wird ein boolesches Flag zurückgegeben, das angibt, ob der Datenstrom 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. Rufen Sie zum Auswählen eines Datenstroms IMFPresentationDescriptor::SelectStream mit dem Index des Datenstroms auf. Rufen Sie zum Deaktivieren eines Datenstroms IMFPresentationDescriptor::D eselectStream-auf.

Der folgende Code zeigt, wie Sie die Präsentationsbeschreibung aus einer Medienquelle abrufen und die Datenströme 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 sich im Datenstrom befindet, z. B. Audio oder Video, rufen Sie IMFMediaTypeHandler::GetMajorTypean. Diese Methode gibt die GUID für den Hauptmedientyp zurück. Eine Wiedergabeanwendung verbindet z. B. in der Regel einen Audiodatenstrom mit dem Audiorenderer und einem Videostream mit dem Videorenderer. Wenn Sie das Mediensitzungs- oder Topologieladeprogramm zum Erstellen einer Topologie verwenden, ist die GuiD des Haupttyps möglicherweise die einzigen benötigten Formatinformationen.

Wenn Ihre Anwendung detailliertere Informationen zum aktuellen Format benötigt, rufen Sie IMFMediaTypeHandler::GetCurrentMediaTypetypeauf. 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 Datenstrom. Rufen Sie IMFMediaTypeHandler::GetMediaTypeCountauf, um die Größe der Liste abzurufen. 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 Voreinstellung zurückgegeben. Bei Audioformaten werden z. B. höhere Samplingraten gegenüber niedrigeren Samplingraten bevorzugt. Es gibt jedoch keine endgültige Regel, die die Bestellung regelt, daher sollten Sie sie einfach als Richtlinie behandeln.

Die Liste der unterstützten Typen enthält möglicherweise nicht jeden möglichen Medientyp, den der Datenstrom unterstützt. Rufen Sie IMFMediaTypeHandler::IsMediaTypeSupportedauf, um zu testen, ob ein bestimmter Medientyp unterstützt wird. Rufen Sie zum Festlegen des Medientyps IMFMediaTypeHandler::SetCurrentMediaTypeauf. Wenn die Methode erfolgreich verläuft, enthält der Datenstrom Daten, die dem angegebenen Format entsprechen. Die SetCurrentMediaType Methode ändert nicht die Liste der bevorzugten Typen.

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 einen Algorithmus aufweist, der nicht hier zum Auswählen des Medientyps angezeigt wird. 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);

Medienquellen

Media Foundation Platform-APIs