Registro em log do cliente (Microsoft Media Foundation)

A fonte de rede dá suporte ao log do cliente, que fornece uma maneira para o servidor de mídia acompanhar a atividade dos clientes que se conectam a ele. Os logs do cliente permitem que um servidor registre a conexão, a renderização e as estatísticas de streaming. Esses logs podem ser usados por provedores de conteúdo em vários cenários, como, para rastrear o uso do servidor de mídia e gerar cobrança ou para fornecer conteúdo de qualidade adequada, dependendo da velocidade da rede do cliente.

Um arquivo de log contém várias entradas de evento de cliente. Cada entrada de log contém vários campos delimitados por espaço. Há dois tipos de logs de cliente: renderização (reprodução ) e streaming (recebimento). Como o conteúdo pode ser reproduzido e transmitido simultaneamente, o cliente pode enviar uma combinação de ambos os tipos de dados de log. Em determinados casos, duas entradas de log podem existir para a mesma sessão. Por exemplo, quando o Cache Rápido está habilitado, o cliente pode concluir o recebimento do conteúdo transmitido antes de concluir a renderização. Nesse caso, os dados de log de streaming seriam enviados antes dos dados de log de renderização.

O cliente envia dados de log de renderização para o servidor quando o cliente muda de qualquer estado de reprodução (reproduzir, avançar ou retroceder) para um estado não reproduzido (parar, pausar, fim do fluxo e início do fluxo). Quando os dados de um log de renderização são enviados, uma conexão é feita diretamente ao servidor de mídia ou a um servidor proxy configurado.

Se o conteúdo for armazenado em um arquivo de cache local temporário no computador que está executando o cliente, o cliente poderá ler um arquivo de seu cache local e enviar os dados de log de renderização para indicar que ele reproduziu o conteúdo. Nesse caso, o cliente lê um arquivo de seu cache local, a entrada de log de renderização não contém nenhuma estatística de rede e o protocolo é definido como Cache.

O cliente envia dados de log de streaming para o servidor para indicar como o cliente recebeu o conteúdo, mas não como ele foi renderizado. O cliente pode enviar o log de streaming muito antes que o cliente termine de renderizar o conteúdo.

Este tópico não fornece informações sobre todos os campos de log. Para obter uma referência completa, consulte Estrutura de dados do Log de Mídia do Windows.

Configurando campos de log

O Media Foundation permite que o cliente configure a fonte de rede usando propriedades. O aplicativo deve definir as propriedades apropriadas em um repositório de propriedades e passá-las para um dos métodos de resolvedor de origem. O resolvedor de origem cria a origem da rede conforme solicitado e abre uma conexão com o servidor. Se a conexão for bem-sucedida, o cliente enviará informações sobre si mesmo.

A tabela a seguir descreve os campos de log e as propriedades correspondentes que um aplicativo pode definir por meio do resolvedor de origem. Essas informações não são alteradas durante a sessão.

Campo de registro em log Descrição
c-playerid Identificação exclusiva do jogador. Essas informações são enviadas no início da conexão. Normalmente, esse é um GUID do cliente. O cliente pode enviar essas informações para o servidor na propriedade MFNETSOURCE_PLAYERID .
O cliente envia essas informações para o servidor no início da conexão.
Valor de exemplo: "{c579d042-cecc-11d1-bb31-00a0c9603954}"
c-playerversion O número de versão do player que é enviado no início da conexão. O cliente pode enviar essas informações para o servidor na propriedade MFNETSOURCE_PLAYERVERSION .
O cliente envia essas informações para o servidor no início da conexão.
cs(User-Agent) Tipo de navegador usado se o player foi inserido em um navegador. Esse valor pode ser definido pelo cliente na propriedade MFNETSOURCE_BROWSERUSERAGENT .
Se o player não tiver sido inserido, esse campo se referirá ao agente do usuário do cliente que gerou o log. Nesse caso, o cliente deve definir a propriedade MFNETSOURCE_PLAYERUSERAGENT .
O cliente envia essas informações para o servidor no início da conexão.
Valor de exemplo: "Mozilla/4.0_(compatible;_MSIE_4.01;_Windows_98)"
cs(Referer) URL da página da Web na qual o player foi inserido (se ele foi inserido). O cliente pode enviar essas informações para o servidor na propriedade MFNETSOURCE_BROWSERWEBPAGE .
O cliente envia essas informações para o servidor no final da conexão.
Valor de exemplo: "https://www.example.microsoft.com"
c-hostexe Para entradas de log do player, o programa host (.exe) que foi executado. Por exemplo, uma página da Web em um navegador, um miniaplicativo do Microsoft Visual Basic ou um player autônomo. O cliente pode enviar essas informações para o servidor na propriedade MFNETSOURCE_HOSTEXE .
O cliente envia essas informações para o servidor no final da conexão.
Valores de amostra:
  • "iexplore.exe"
  • "myplayer.exe"
c-hostexever Número de versão do programa host (.exe). O cliente pode enviar essas informações para o servidor na propriedade MFNETSOURCE_HOSTVERSION .
O cliente envia essas informações para o servidor no final da conexão.

O exemplo de código a seguir mostra como um aplicativo cliente configura a origem da rede. Este exemplo define o campo de log "c-hostexe".

// Creates a media source from a URL.
//
// This example demonstrates how to set the MFNETSOURCE_HOSTEXE
// configuration property on the network source.

HRESULT CreateMediaSourceWithLogParams(
    PCWSTR pszURL, 
    IMFMediaSource **ppSource
    )
{
    IPropertyStore *pConfig = NULL;

    // Configure the property store.
    HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid =  MFNETSOURCE_HOSTEXE;
        key.pid = 0;

        PROPVARIANT var;
        var.vt = VT_LPWSTR;
        var.pwszVal = L"MyPlayer.exe";

        hr = pConfig->SetValue(key, var);
    }

    // Create the source media source.
    if (SUCCEEDED(hr))
    {
        hr = CreateMediaSource(pszURL, pConfig, ppSource);
    }

    SafeRelease(&pConfig);
    return hr;
}

Recuperando estatísticas de rede

Quando o aplicativo chama um dos métodos de resolvedor de origem, ele cria a origem da rede, define as propriedades especificadas no repositório de propriedades e abre uma sessão com o servidor de mídia. Além das informações configuráveis descritas na seção anterior, dados adicionais são transferidos entre o servidor e o cliente no início da sessão, durante o streaming e quando a sessão é fechada.

O aplicativo pode recuperar estatísticas de rede usando o identificador de 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 que contém estatísticas de rede na propriedade MFNETSOURCE_STATISTICS . Valores específicos podem ser recuperados fornecendo o identificador correspondente definido na enumeração MFNETSOURCE_STATISTICS_IDS .

O exemplo de código a seguir mostra como usar o serviço para obter o número de pacotes recebidos pelo cliente.

HRESULT GetPacketsReceived(IMFMediaSession *pSession, DWORD *pcPackets)
{
    IPropertyStore *pProp = NULL;
    PROPVARIANT var;

    // Get the property store from the media session.
    HRESULT hr = MFGetService(
        pSession, 
        MFNETSOURCE_STATISTICS_SERVICE, 
        IID_PPV_ARGS(&pProp)
        );

    // Get the number of packets received by the client.

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid = MFNETSOURCE_STATISTICS;
        key.pid = MFNETSOURCE_RECVPACKETS_ID;

        hr = pProp->GetValue(key, &var);
    }

    if (SUCCEEDED(hr))
    {
        *pcPackets = var.lVal;
    }

    PropVariantClear(&var);
    SafeRelease(&pProp);
    return hr;
}

A lista a seguir descreve alguns dos identificadores de estatísticas de rede definidos em MFNETSOURCE_STATISTICS_IDS.

Identificador de estatísticas de rede Descrição
MFNETSOURCE_AVGBANDWIDTHBPS_ID Largura de banda média (em bits por segundo) na qual o cliente estava conectado ao servidor. O valor é calculado em toda a duração da conexão.
MFNETSOURCE_BUFFERINGCOUNT_ID Número de vezes que o cliente foi armazenado em buffer durante a reprodução do fluxo.
MFNETSOURCE_BYTESRECEIVED_ID Número de bytes recebidos pelo cliente do servidor. O valor não inclui nenhuma sobrecarga adicionada pela pilha de rede. O mesmo conteúdo transmitido usando protocolos diferentes pode resultar em valores diferentes.
MFNETSOURCE_LINKBANDWIDTH_ID Largura de banda máxima disponível do cliente em bits por segundo.
MFNETSOURCE_LOSTPACKETS_ID Número de pacotes enviados pelo servidor, mas perdidos durante a transmissão e nunca reproduzidos pelo cliente. O valor não inclui pacotes TCP ou UDP.
MFNETSOURCE_RECVPACKETS_ID Número de pacotes recebidos do servidor O valor não inclui pacotes TCP ou UDP.
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID Pacotes perdidos na rede que foram reparados e recuperados na camada do cliente. Esse valor não inclui pacotes TCP ou UDP.
MFNETSOURCE_RESENDSREQUESTED_ID O número de solicitações feitas pelo cliente para receber novos pacotes. Esse valor não inclui pacotes TCP ou UDP.
MFNETSOURCE_RECOVEREDPACKETS_ID Número de pacotes recuperados porque foram reenviados por meio do UDP. Esse valor não inclui pacotes TCP ou UDP. Esse campo contém um zero, a menos que o cliente esteja usando reenviar UDP.
MFNETSOURCE_BUFFERPROGRESS_ID O percentual do buffer de reprodução preenchido durante o buffer.
MFNETSOURCE_PROTOCOL_ID Protocolo usado para acessar o fluxo. Isso pode ser diferente do protocolo solicitado pelo cliente.
MFNETSOURCE_TRANSPORT_ID Protocolo de transporte usado para entregar o fluxo. Isso deve ser UDP ou TCP.

Recursos de origem de rede

Networking in Media Foundation