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:
|
Rtspu:// | RTSPU |
Rtspt:// | RTSPT |
https:// |
|
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. |
Tópicos relacionados