Präsentationsdeskriptoren
Eine Präsentation ist ein Satz verwandter Medienstreams, die eine gemeinsame Präsentationszeit gemeinsam haben. Eine Präsentation kann beispielsweise aus 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 Streamdeskriptor. Diese beschreiben die Streams in der Präsentation. Streams kann 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 Streams zu ändern oder den aktuellen Medientyp des Streams zu erhalten. (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 | BESCHRIFTungDescriptor |
| Streamdeskriptor | JAVASCRIPTStreamDescriptor |
| Medientyphandler | DELEGATEMediaTypeHandler |
Medienquellenpräsentationen
Jede Medienquelle bietet einen Präsentationsdeskriptor, der die Standardkonfiguration für die Quelle beschreibt. In der Standardkonfiguration ist mindestens ein Stream ausgewählt, und jeder ausgewählte Stream hat einen Medientyp. Um den Präsentationsdeskriptor zu erhalten, rufen Sie DANNMediaSource::CreatePresentationDescriptor auf. Die -Methode gibt einen POINTERPresentationDescriptor zurück.
Sie können den Präsentationsdeskriptor der Quelle ändern, um einen anderen Satz von Streams auszuwählen. Ändern Sie den Präsentationsdeskriptor nur, wenn die Medienquelle beendet wurde. Die Änderungen werden angewendet, wenn Sie ZUM STARTEN DIEMEDIASource::Start aufrufen, um die Quelle zu starten.
Um die Anzahl der Streams zu erhalten, rufen Sie DANNPresentationDescriptor::GetStreamDescriptorCount auf. Um den Streamdeskriptor für einen Stream zu erhalten, rufen Sie DIEPRESENTATIONDescriptor::GetStreamDescriptorByIndex auf, und übergeben Sie den Index des Streams. Streams werden von 0 (null) indiziert. Die GetStreamDescriptorByIndex-Methode gibt einen ATTRIBUTSTREAMDescriptor-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 Stream. Andernfalls erzeugt die Quelle keine Daten für diesen Stream. Um einen Stream auszuwählen, rufen Sie DIEPRESENTPresentationDescriptor::SelectStream mit dem Index des Streams auf. Um die Auswahl eines Streams aufzuheben, rufen Sie DANNPresentationDescriptor::D eselectStream auf.
Der folgende Code zeigt, wie Sie den Präsentationsdeskriptor aus einer Medienquelle erhalten und die Streams 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
Um den Medientyp des Streams zu ändern oder den aktuellen Medientyp des Streams zu erhalten, verwenden Sie den Medientyphandler des Streamdeskriptors. Rufen Sie DIESTREAMDescriptor::GetMediaTypeHandler auf, um den Medientyphandler zu erhalten. Diese Methode gibt einen POINTer VOM TYP1155 zurück.
Wenn Sie einfach wissen möchten, welche Art von Daten im Stream vorkommt, z. B. Audio oder Video, rufen Sie DEN TYP Handler::GetMajorType auf. Diese Methode gibt die GUID für den Hauptmedientyp zurück. Beispielsweise verbindet eine Wiedergabeanwendung in der Regel einen Audiostream mit dem Audiorenderer und einen Videostream mit dem Videorenderer. Wenn Sie die Mediensitzung oder das Topologielader verwenden, um eine Topologie zu erstellen, ist die Haupttyp-GUID möglicherweise die einzige Formatinformation, die Sie benötigen.
Wenn Ihre Anwendung ausführlichere Informationen über das aktuelle Format benötigt, rufen Sie DIEMEDIATypeHandler::GetCurrentMediaType auf. Diese Methode gibt einen Zeiger auf die BESCHRIFTUNGMediaType-Schnittstelle des Medientyps zurück. Verwenden Sie diese Schnittstelle, um die Details des Formats zu erhalten.
Der Medientyphandler enthält auch eine Liste der unterstützten Medientypen für den Stream. Um die Größe der Liste zu erhalten, rufen Sie DIEMEDIATypeHandler::GetMediaTypeCount auf. Um einen Medientyp aus der Liste zu erhalten, rufen Sie DIEMEDIATypeHandler::GetMediaTypeByIndex mit dem Index des Medientyps auf. Medientypen werden in der ungefähren Reihenfolge ihrer Präferenz zurückgegeben. Bei Audioformaten werden beispielsweise höhere Abtastraten gegenüber niedrigeren Abtastraten bevorzugt. Es gibt jedoch keine definitive Regel, die die Reihenfolge steuert, daher sollten Sie sie einfach als Richtlinie behandeln.
Die Liste der unterstützten Typen enthält möglicherweise nicht alle möglichen Medientypen, die der Stream unterstützt. Um zu testen, ob ein bestimmter Medientyp unterstützt wird, rufen Sie DIEMEDIATypeHandler::IsMediaTypeSupported auf. Um den Medientyp fest zu legen, rufen Sie DEN MEDIENTYPHANDLER::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 erhalten, die bevorzugten Medientypen aufzählen und den Medientyp festlegen. In diesem Beispiel wird davon ausgegangen, dass die Anwendung über einen Algorithmus verfügt, der hier nicht angezeigt 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);