Protocolos admitidos

Media Foundation admite los siguientes protocolos:

  • Protocolo de streaming en tiempo real (RTSP)

    RTSP se usa principalmente para el streaming de contenido multimedia. Puede usar UDP o TCP como protocolos de transporte. UDP es el más eficaz para la entrega de contenido porque la sobrecarga de ancho de banda es menor que con protocolos basados en TCP. Aunque el protocolo TCP garantiza una entrega de paquetes confiable, TCP no es adecuado para flujos multimedia digitales, donde el uso eficaz del ancho de banda es más importante que los paquetes perdidos ocasionales.

  • Protocolo de transferencia de hipertexto (HTTP)

    HTTP usa TCP y lo usan los servidores web. El esquema "httpd://" indica que el origen se puede descargar desde un servidor web. HTTP también se usa en el caso de los firewalls, que normalmente se configuran para aceptar solicitudes HTTP y normalmente rechazan otros protocolos de streaming.

La aplicación puede obtener los protocolos admitidos por Media Foundation mediante la interfaz IMFNetSchemeHandlerConfig . Para ello, la aplicación debe recuperar primero el número de protocolos mediante una llamada a IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols y, a continuación, obtener el tipo de protocolo basado en el índice mediante una llamada a IMFNetSchemeHandlerConfig::GetSupportedProtocolType. Este método devuelve uno de los valores definidos en la enumeración MFNETSOURCE_PROTOCOL_TYPE .

La aplicación también puede obtener los esquemas admitidos por la resolución de origen llamando a la función MFGetSupportedSchemes .

Sustitución de protocolos

Cuando una aplicación especifica "mms://" como esquema de dirección URL, el solucionador de origen realiza una operación de sustitución de protocolos . En este proceso, el solucionador de origen determina el mejor protocolo para que el origen de red lo use para obtener el contenido. Normalmente, para el vapor de medios, RTSP con UDP (RTSPU) es más eficaz que HTTP. Sin embargo, si el contenido se hospeda en un servidor web, HTTP es una mejor opción.

La sustitución de protocolos también puede producirse cuando se produce un error al intentar usar el protocolo especificado en el esquema de dirección URL. Por ejemplo, un protocolo puede producir un error cuando un firewall bloquea los paquetes UDP. En este caso, el solucionador de origen cambia a HTTP.

La sustitución de protocolos no se aplica si el esquema de dirección URL contiene un protocolo específico, como "rtspu://". Además, la sustitución no se realiza si se produce un error en la autenticación o el servidor ha alcanzado un límite de conexiones de cliente. Se recomienda que las aplicaciones especifiquen el esquema "mms://" y permitan al solucionador de origen seleccionar el mejor protocolo para el escenario.

En la tabla siguiente se muestra el orden de sustitución.

Esquemas permitidos Orden de sustitución de protocolos
mms:// o rtsp:// Caché rápida habilitada:
  1. RTSP con TCP (RTSPT)
  2. RTSP con UDP (RTSPU)
  3. HTTP Streaming
  4. Descarga HTTP (HTTPD)
Caché rápida deshabilitada:
  1. RTSPU
  2. RTSPT
  3. HTTP Streaming
  4. Descarga HTTP
rtspu:// RTSPU
rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

Recuperación del protocolo actual

Después de una operación de sustitución de protocolos, el origen de red podría usar un protocolo distinto del especificado por la aplicación en el esquema de dirección URL. El resultado de la sustitución de protocolos está disponible para la aplicación después de que el origen de red establezca la conexión con el servidor multimedia.

Para obtener el protocolo y el transporte que se usan para obtener el contenido, la aplicación puede recuperar los valores de propiedad de la propiedad MFNETSOURCE_PROTOCOL y la propiedad MFNETSOURCE_TRANSPORT de un objeto IPropertyStore del origen de red.

En el código siguiente se muestra cómo obtener estos valores.

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

    }

En el código de ejemplo anterior, IPropertyStore::GetValue recupera el valor MFNETSOURCE_PROTOCOL, que es un miembro de la enumeración MFNETSOURCE_PROTOCOL_TYPE . Para MFNETSOURCE_TRANSPORT, el valor es un miembro de la enumeración MFNETSOURCE_TRANSPORT_TYPE .

Como alternativa, la aplicación puede obtener los mismos valores mediante el servicio MFNETSOURCE_STATISTICS_SERVICE. Para usar este servicio, la aplicación puede llamar a la función MFGetService para obtener el almacén de propiedades del origen de red. Este almacén de propiedades contiene estadísticas de red en la propiedad MFNETSOURCE_STATISTICS . Los valores de protocolo y transporte se pueden recuperar especificando MFNETSOURCE_PROTOCOL_ID y MFNETSOURCE_TRANSPORT_ID, definidos en la enumeración MFNETSOURCE_STATISTICS_IDS . En el código siguiente se muestra cómo obtener los valores de protocolo y transporte mediante el servicio 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);

    }

Habilitación y deshabilitación de protocolos

La aplicación puede configurar el origen de red para que se omitan determinados protocolos durante el proceso de sustitución. Para ello, las propiedades de origen de red se usan para deshabilitar protocolos específicos. En la tabla siguiente se muestran las propiedades y los protocolos que controlan.

Propiedad Descripción
MFNETSOURCE_ENABLE_HTTP Habilita o deshabilita HTTP y HTTPD.
MFNETSOURCE_ENABLE_RTSP Habilita o deshabilita RTSPU y RTSPT.
MFNETSOURCE_ENABLE_TCP Habilita o deshabilita RTSPT.
MFNETSOURCE_ENABLE_UDP Habilita o deshabilita RTSPU.
MFNETSOURCE_ENABLE_DOWNLOAD Habilita o deshabilita HTTPD.
MFNETSOURCE_ENABLE_STREAMING Habilita o deshabilita RTSPU, RTSPT y HTTP.

 

Redes en Media Foundation