Protocolos compatíveis

O Media Foundation dá suporte aos seguintes protocolos:

  • RTSP (Protocolo de Streaming em Tempo Real)

    O RTSP é usado principalmente para conteúdo de mídia de streaming. Ele pode usar UDP ou TCP como protocolos de transporte. O UDP é o mais eficiente para a entrega de conteúdo porque a sobrecarga de largura de banda é menor do que com protocolos baseados em TCP. Embora o protocolo TCP garanta uma entrega confiável de pacotes, o TCP não é adequado para fluxos de mídia digital, em que o uso eficiente da largura de banda é mais importante do que pacotes perdidos ocasionais.

  • Protocolo HTTP

    HTTP usa TCP e é usado por servidores Web. O esquema "httpd://" indica que a origem pode ser baixada de um servidor Web. O HTTP também é usado no caso de firewalls, que geralmente são configurados para aceitar solicitações HTTP e normalmente rejeitam outros protocolos de streaming.

O aplicativo pode obter os protocolos compatíveis com o Media Foundation usando a interface IMFNetSchemeHandlerConfig . Para fazer isso, o aplicativo deve primeiro recuperar o número de protocolos, chamando IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols e, em seguida, obter o tipo de protocolo com base no índice chamando IMFNetSchemeHandlerConfig::GetSupportedProtocolType. Esse método retorna um dos valores definidos na enumeração MFNETSOURCE_PROTOCOL_TYPE .

O aplicativo também pode obter os esquemas compatíveis com o resolvedor de origem chamando a função MFGetSupportedSchemes .

Substituição de protocolo

Quando um aplicativo especifica "mms://" como o esquema de URL, o resolvedor de origem executa uma operação de substituição de protocolo . Nesse processo, o resolvedor de origem determina o melhor protocolo para a fonte de rede usar para obter o conteúdo. Normalmente, para vapor de mídia, RTSP com UDP (RTSPU) é mais eficiente do que HTTP. No entanto, se o conteúdo estiver hospedado em um servidor Web, HTTP será uma opção melhor.

A substituição de protocolo também pode ocorrer quando uma tentativa de usar o protocolo especificado no esquema de URL falha. Por exemplo, um protocolo pode falhar quando um firewall bloqueia pacotes UDP. Nesse caso, o resolvedor de origem alterna para HTTP.

A substituição de protocolo não se aplicará se o esquema de URL contiver um protocolo específico, como "rtspu://". Além disso, a substituição não será executada se a autenticação falhar ou se o servidor tiver atingido um limite de conexões de cliente. É recomendável que os aplicativos especifiquem o esquema "mms://" e permitam que o resolvedor de origem selecione o melhor protocolo para o cenário.

A tabela a seguir lista a ordem de substituição.

Esquemas permitidos Ordem de substituição de protocolo
mms:// ou rtsp:// Cache Rápido habilitado:
  1. RTSP com TCP (RTSPT)
  2. RTSP com UDP (RTSPU)
  3. HTTP Streaming
  4. Download http (HTTPD)
Cache Rápido desabilitado:
  1. RTSPU
  2. RTSPT
  3. HTTP Streaming
  4. HTTP Download
Rtspu:// RTSPU
Rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
httpd:// HTTPD

 

Recuperando o protocolo atual

Após uma operação de substituição de protocolo, a origem da rede pode usar um protocolo diferente do especificado pelo aplicativo no esquema de URL. O resultado da substituição de protocolo está disponível para o aplicativo depois que a origem da rede estabelece a conexão com o servidor de mídia.

Para obter o protocolo e o transporte usados para obter o conteúdo, o aplicativo pode recuperar os valores de propriedade para a propriedade MFNETSOURCE_PROTOCOL e a propriedade MFNETSOURCE_TRANSPORT de um objeto IPropertyStore da origem da rede.

O código a seguir mostra como obter esses 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);

    }

No código de exemplo anterior, IPropertyStore::GetValue recupera o valor MFNETSOURCE_PROTOCOL, que é um membro da enumeração MFNETSOURCE_PROTOCOL_TYPE . Para MFNETSOURCE_TRANSPORT, o valor é um membro da enumeração MFNETSOURCE_TRANSPORT_TYPE .

Como alternativa, o aplicativo pode obter os mesmos valores usando o serviço MFNETSOURCE_STATISTICS_SERVICE. Para usar esse serviço, o aplicativo pode chamar a função MFGetService para obter o repositório de propriedades da origem da rede. Esse repositório de propriedades contém estatísticas de rede na propriedade MFNETSOURCE_STATISTICS . Os valores de protocolo e transporte podem ser recuperados especificando MFNETSOURCE_PROTOCOL_ID e MFNETSOURCE_TRANSPORT_ID, definidos na enumeração MFNETSOURCE_STATISTICS_IDS . O código a seguir mostra como obter os valores de protocolo e transporte usando o serviço 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);

    }

Habilitando e desabilitando protocolos

O aplicativo pode configurar a origem da rede para que determinados protocolos sejam ignorados durante o processo de substituição. Para fazer isso, as propriedades de origem de rede são usadas para desabilitar protocolos específicos. A tabela a seguir mostra as propriedades e os protocolos que eles controlam.

Propriedade Descrição
MFNETSOURCE_ENABLE_HTTP Habilita ou desabilita HTTP e HTTPD.
MFNETSOURCE_ENABLE_RTSP Habilita ou desabilita RTSPU e RTSPT.
MFNETSOURCE_ENABLE_TCP Habilita ou desabilita o RTSPT.
MFNETSOURCE_ENABLE_UDP Habilita ou desabilita a RTSPU.
MFNETSOURCE_ENABLE_DOWNLOAD Habilita ou desabilita HTTPD.
MFNETSOURCE_ENABLE_STREAMING Habilita ou desabilita RTSPU, RTSPT e HTTP.

 

Networking in Media Foundation