Unterstützte Protokolle

Media Foundation unterstützt die folgenden Protokolle:

  • Real Time Streaming Protocol (RTSP)

    RTSP wird hauptsächlich zum Streamen von Medieninhalten verwendet. Es kann UDP oder TCP als Transportprotokolle verwenden. UDP ist die effizienteste für die Inhaltsübermittlung, da der Bandbreitenaufwand geringer ist als bei TCP-basierten Protokollen. Obwohl das TCP-Protokoll eine zuverlässige Paketübermittlung gewährleistet, eignet sich TCP nicht gut für digitale Medienströme, bei denen eine effiziente Nutzung der Bandbreite wichtiger ist als gelegentlich verlorene Pakete.

  • Hypertext Transfer-Protokoll (HTTP)

    HTTP verwendet TCP und wird von Webservern verwendet. Das Schema "httpd://" gibt an, dass die Quelle von einem Webserver heruntergeladen werden kann. HTTP wird auch bei Firewalls verwendet, die normalerweise so konfiguriert sind, dass sie HTTP-Anforderungen akzeptieren und in der Regel andere Streamingprotokolle ablehnen.

Die Anwendung kann die von Media Foundation unterstützten Protokolle mithilfe der IMFNetSchemeHandlerConfig-Schnittstelle abrufen. Dazu muss die Anwendung zuerst die Anzahl der Protokolle abrufen, indem SIE IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols aufruft und dann den Protokolltyp basierend auf dem Index abrufen, indem SIE IMFNetSchemeHandlerConfig::GetSupportedProtocolType aufruft. Diese Methode gibt einen der in der MFNETSOURCE_PROTOCOL_TYPE-Enumeration definierten Werte zurück.

Die Anwendung kann auch die vom Quelllöser unterstützten Schemas abrufen, indem sie die MFGetSupportedSchemes-Funktion aufruft .

Protokollrollover

Wenn eine Anwendung "mms://" als URL-Schema angibt, führt der Quelllöser einen Protokollrollovervorgang aus. In diesem Prozess bestimmt der Quelllöser das beste Protokoll für die Netzwerkquelle, die zum Abrufen des Inhalts verwendet werden soll. In der Regel ist RTSP mit UDP (RTSPU) für Mediendampfung effizienter als HTTP. Wenn der Inhalt jedoch auf einem Webserver gehostet wird, ist HTTP die bessere Wahl.

Protokollrollover kann auch auftreten, wenn ein Versuch, das im URL-Schema angegebene Protokoll zu verwenden, fehlschlägt. Beispielsweise kann ein Protokoll fehlschlagen, wenn eine Firewall UDP-Pakete blockiert. In diesem Fall wechselt der Quelllöser zu HTTP.

Der Protokollrollover gilt nicht, wenn das URL-Schema ein bestimmtes Protokoll enthält, z. B. "rtspu://". Außerdem wird kein Rollover ausgeführt, wenn die Authentifizierung fehlschlägt oder der Server ein Limit für Clientverbindungen erreicht hat. Es wird empfohlen, dass Anwendungen das schema "mms://" angeben und dem Quelllöser erlauben, das beste Protokoll für das Szenario auszuwählen.

In der folgenden Tabelle ist die Rolloverreihenfolge aufgeführt.

Zulässige Schemas Protokollrolloverreihenfolge
mms:// oder rtsp:// Fast Cache aktiviert:
  1. RTSP mit TCP (RTSPT)
  2. RTSP mit UDP (RTSPU)
  3. HTTP-Streaming
  4. HTTP-Download (HTTPD)
Fast Cache deaktiviert:
  1. RTSPU
  2. RTSPT
  3. HTTP-Streaming
  4. HTTP-Download
Rtspu:// RTSPU
rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

Abrufen des aktuellen Protokolls

Nach einem Protokollrollovervorgang verwendet die Netzwerkquelle möglicherweise ein anderes Protokoll als das von der Anwendung im URL-Schema angegebene Protokoll. Das Protokollrolloverergebnis steht der Anwendung zur Verfügung, nachdem die Netzwerkquelle die Verbindung mit dem Medienserver hergestellt hat.

Um das Protokoll und den Transport abzurufen, die zum Abrufen des Inhalts verwendet werden, kann die Anwendung die Eigenschaftswerte für die MFNETSOURCE_PROTOCOL-Eigenschaft und die MFNETSOURCE_TRANSPORT-Eigenschaft eines IPropertyStore-Objekts aus der Netzwerkquelle abrufen.

Der folgende Code zeigt, wie Sie diese Werte abrufen.

// Create an IPropertyStore object.
    IPropertyStore *pProp = NULL;
    hr = CreatePropertyStore(&pProp);

    PROPVARIANT var;
    PropVariantInit(&var);

// Get the property store from the network source.
// The network source is created by the source resolver. Not shown.
    if (SUCCEEDED(hr))
    {
        hr = pNetworkSource->QueryInterface 
                (__uuidof(IPropertyStore), 
                (void**)&pProp);
    }
    if (SUCCEEDED(hr))
    {
        // Create a property key.
        PROPERTYKEY key;
        // Get the MFNETSOURCE_PROTOCOL property value.
        key.fmtid = MFNETSOURCE_PROTOCOL;
        hr = pProp->GetValue (key, &var);

        // Get the MFNETSOURCE_TRANSPORT property value.
        key.fmtid = MFNETSOURCE_TRANSPORT;
        key.pid = 0;
        hr = pProp->GetValue (key, &var);

    }

Im vorherigen Beispielcode ruft IPropertyStore::GetValue den MFNETSOURCE_PROTOCOL-Wert ab, der ein Member der MFNETSOURCE_PROTOCOL_TYPE-Enumeration ist. Für MFNETSOURCE_TRANSPORT ist der Wert ein Member der MFNETSOURCE_TRANSPORT_TYPE-Enumeration .

Alternativ kann die Anwendung dieselben Werte mithilfe des MFNETSOURCE_STATISTICS_SERVICE-Diensts abrufen. Um diesen Dienst zu verwenden, kann die Anwendung die MFGetService-Funktion aufrufen, um den Eigenschaftenspeicher aus der Netzwerkquelle abzurufen. Dieser Eigenschaftenspeicher enthält Netzwerkstatistiken in der eigenschaft MFNETSOURCE_STATISTICS . Protokoll- und Transportwerte können abgerufen werden, indem sie MFNETSOURCE_PROTOCOL_ID und MFNETSOURCE_TRANSPORT_ID angeben, die in der MFNETSOURCE_STATISTICS_IDS-Enumeration definiert sind. Der folgende Code zeigt, wie Sie das Protokoll und die Transportwerte mithilfe des MFNETSOURCE_STATISTICS_SERVICE-Diensts abrufen.

// Create an IPropertyStore object.
    IPropertyStore *pProp = NULL;
    hr = CreatePropertyStore(&pProp);

    HRESULT hr = S_OK;

    hr = MFGetService(
        pMediaSource, 
        MFNETSOURCE_STATISTICS_SERVICE, 
        IID_IPropertyStore, 
        (void**) & pProp); 

    if (SUCCEEDED(hr))
    {
        // Create a property key.
        PROPERTYKEY key;
        // Get the property value.
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_PROTOCOL_ID;
        hr = pProp->GetValue (key, &var);

        // Get the transport value.
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_TRANSPORT_ID;
        hr = pProp->GetValue (key, &var);

    }

Aktivieren und Deaktivieren von Protokollen

Die Anwendung kann die Netzwerkquelle so konfigurieren, dass bestimmte Protokolle während des Rollovervorgangs übersprungen werden. Hierzu werden Netzwerkquelleigenschaften verwendet, um bestimmte Protokolle zu deaktivieren. In der folgenden Tabelle sind die Eigenschaften und protokolle aufgeführt, die sie steuern.

Eigenschaft BESCHREIBUNG
MFNETSOURCE_ENABLE_HTTP Aktiviert oder deaktiviert HTTP und HTTPD.
MFNETSOURCE_ENABLE_RTSP Aktiviert oder deaktiviert RTSPU und RTSPT.
MFNETSOURCE_ENABLE_TCP Aktiviert oder deaktiviert RTSPT.
MFNETSOURCE_ENABLE_UDP Aktiviert oder deaktiviert RTSPU.
MFNETSOURCE_ENABLE_DOWNLOAD Aktiviert oder deaktiviert HTTPD.
MFNETSOURCE_ENABLE_STREAMING Aktiviert oder deaktiviert RTSPU, RTSPT und HTTP.

 

Netzwerk in Media Foundation