Protocoles pris en charge

Media Foundation prend en charge les protocoles suivants :

  • Protocole RTSP (Real Time Streaming Protocol)

    RTSP est principalement utilisé pour la diffusion en continu de contenu multimédia. Il peut utiliser UDP ou TCP comme protocoles de transport. UDP est le plus efficace pour la distribution de contenu, car la surcharge de bande passante est inférieure à celle des protocoles TCP. Même si le protocole TCP garantit une remise fiable des paquets, TCP n’est pas bien adapté aux flux multimédias numériques, où l’utilisation efficace de la bande passante est plus importante que les paquets perdus occasionnellement.

  • Hypertext Transfer Protocol (HTTP)

    HTTP utilise TCP et est utilisé par les serveurs web. Le schéma « httpd:// » indique que la source est téléchargeable à partir d’un serveur web. HTTP est également utilisé dans le cas de pare-feu, qui sont généralement configurés pour accepter les requêtes HTTP et rejettent généralement d’autres protocoles de streaming.

L’application peut obtenir les protocoles pris en charge par Media Foundation à l’aide de l’interface IMFNetSchemeHandlerConfig . Pour ce faire, l’application doit d’abord récupérer le nombre de protocoles, en appelant IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols , puis obtenir le type de protocole basé sur l’index en appelant IMFNetSchemeHandlerConfig::GetSupportedProtocolType. Cette méthode retourne l’une des valeurs définies dans l’énumération MFNETSOURCE_PROTOCOL_TYPE .

L’application peut également obtenir les schémas pris en charge par le programme de résolution source en appelant la fonction MFGetSupportedSchemes .

Substitution de protocole

Lorsqu’une application spécifie « mms:// » comme schéma d’URL, le programme de résolution source effectue une opération de substitution de protocole . Dans ce processus, le programme de résolution de la source détermine le meilleur protocole pour la source réseau à utiliser pour obtenir le contenu. En règle générale, pour la vapeur des médias, RTSP avec UDP (RTSPU) est plus efficace que HTTP. Toutefois, si le contenu est hébergé sur un serveur web, HTTP est un meilleur choix.

La substitution de protocole peut également se produire lorsqu’une tentative d’utilisation du protocole spécifié dans le schéma d’URL échoue. Par exemple, un protocole peut échouer lorsqu’un pare-feu bloque les paquets UDP. Dans ce cas, le programme de résolution source bascule vers HTTP.

La substitution de protocole ne s’applique pas si le schéma d’URL contient un protocole spécifique, tel que « rtspu:// ». En outre, la substitution n’est pas effectuée si l’authentification échoue ou si le serveur a atteint une limite de connexions clientes. Il est recommandé que les applications spécifient le schéma « mms:// » et autorisent le programme de résolution source à sélectionner le meilleur protocole pour le scénario.

Le tableau suivant répertorie l’ordre de substitution.

Schémas autorisés Ordre de substitution de protocole
mms:// ou rtsp:// Mise en cache rapide activée :
  1. RTSP avec TCP (RTSPT)
  2. RTSP avec UDP (RTSPU)
  3. HTTP Streaming
  4. Téléchargement HTTP (HTTPD)
Cache rapide désactivé :
  1. RTSPU
  2. RTSPT
  3. HTTP Streaming
  4. Téléchargement HTTP
rtspu:// RTSPU
rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

Récupération du protocole actuel

Après une opération de substitution de protocole, la source réseau peut utiliser un protocole autre que celui spécifié par l’application dans le schéma d’URL. Le résultat de la substitution de protocole est disponible pour l’application une fois que la source réseau a établi la connexion avec le serveur multimédia.

Pour obtenir le protocole et le transport utilisés pour obtenir le contenu, l’application peut récupérer les valeurs de propriété de la propriété MFNETSOURCE_PROTOCOL et la propriété MFNETSOURCE_TRANSPORT d’un objet IPropertyStore à partir de la source réseau.

Le code suivant montre comment obtenir ces valeurs.

// 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);

    }

Dans l’exemple de code précédent, IPropertyStore::GetValue récupère la valeur MFNETSOURCE_PROTOCOL, qui est un membre de l’énumération MFNETSOURCE_PROTOCOL_TYPE . Pour MFNETSOURCE_TRANSPORT, la valeur est membre de l’énumération MFNETSOURCE_TRANSPORT_TYPE .

L’application peut également obtenir les mêmes valeurs à l’aide du service MFNETSOURCE_STATISTICS_SERVICE. Pour utiliser ce service, l’application peut appeler la fonction MFGetService pour obtenir le magasin de propriétés à partir de la source réseau. Ce magasin de propriétés contient des statistiques réseau dans la propriété MFNETSOURCE_STATISTICS . Les valeurs de protocole et de transport peuvent être récupérées en spécifiant MFNETSOURCE_PROTOCOL_ID et MFNETSOURCE_TRANSPORT_ID, définies dans l’énumération MFNETSOURCE_STATISTICS_IDS . Le code suivant montre comment obtenir les valeurs de protocole et de transport à l’aide du service MFNETSOURCE_STATISTICS_SERVICE.

// 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);

    }

Activation et désactivation des protocoles

L’application peut configurer la source réseau afin que certains protocoles soient ignorés pendant le processus de substitution. Pour ce faire, les propriétés de source réseau sont utilisées pour désactiver des protocoles spécifiques. Le tableau suivant présente les propriétés et les protocoles qu’elles contrôlent.

Propriété Description
MFNETSOURCE_ENABLE_HTTP Active ou désactive HTTP et HTTPD.
MFNETSOURCE_ENABLE_RTSP Active ou désactive RTSPU et RTSPT.
MFNETSOURCE_ENABLE_TCP Active ou désactive RTSPT.
MFNETSOURCE_ENABLE_UDP Active ou désactive RTSPU.
MFNETSOURCE_ENABLE_DOWNLOAD Active ou désactive HTTPD.
MFNETSOURCE_ENABLE_STREAMING Active ou désactive RTSPU, RTSPT et HTTP.

 

Mise en réseau dans Media Foundation