Ведение журнала клиента (Microsoft Media Foundation)

Сетевой источник поддерживает ведение журнала клиентов, что позволяет серверу мультимедиа отслеживать действия клиентов, подключающихся к нему. Журналы клиентов позволяют серверу записывать статистику подключения, отрисовки и потоковой передачи. Эти журналы могут использоваться поставщиками содержимого в различных сценариях, например для отслеживания использования сервера мультимедиа и выставления счетов, а также для доставки содержимого подходящего качества в зависимости от скорости сети клиента.

Файл журнала содержит несколько записей событий клиента. Каждая запись журнала содержит ряд полей с разделителями пробелами. Существует два типа журналов клиента: отрисовка (воспроизведение) и потоковая передача (получение). Так как содержимое может воспроизводиться и передаваться в потоковую передачу одновременно, клиент может отправлять сочетание обоих типов данных журнала. В некоторых случаях для одного сеанса могут существовать две записи журнала. Например, если включен быстрый кэш, клиент может завершить получение потокового содержимого до завершения его отрисовки. В этом случае данные журнала потоковой передачи будут отправляться перед данными журнала отрисовки.

Клиент отправляет данные журнала отрисовки на сервер, когда клиент переходит из любого состояния воспроизведения (воспроизведение, быстрое перемещение вперед или перемотка) в не воспроизводимое состояние (остановка, приостановка, конец потока и начало потока). При отправке данных для журнала отрисовки соединение выполняется непосредственно с сервером мультимедиа или настроенным прокси-сервером.

Если содержимое хранится во временном файле локального кэша на компьютере, на котором выполняется клиент, клиент может прочитать файл из локального кэша и отправить данные журнала отрисовки, чтобы указать, что он воспроизводил содержимое. В этом случае клиент считывает файл из локального кэша, запись журнала отрисовки не содержит статистики по сети, а для протокола задано значение Кэш.

Клиент отправляет данные журнала потоковой передачи на сервер, чтобы указать, как клиент получил содержимое, но не как оно было отрисовывается. Клиент может отправить журнал потоковой передачи задолго до завершения отрисовки содержимого.

В этом разделе содержатся сведения не обо всех полях журнала. Полный справочник см. в статье Структура данных журнала Windows Media.

Настройка полей журнала

Media Foundation позволяет клиенту настроить сетевой источник с помощью свойств. Приложение должно задать соответствующие свойства в хранилище свойств и передать их одному из методов сопоставителя источника. Сопоставитель источника создает сетевой источник в соответствии с запросом и открывает подключение к серверу. Если подключение установлено успешно, клиент отправляет сведения о себе.

В следующей таблице описаны поля журнала и соответствующие свойства, которые приложение может задать с помощью сопоставителя источника. Эти сведения не изменяются во время сеанса.

Поле ведения журнала Описание
c-playerid Уникальная идентификация игрока. Эти сведения отправляются в начале подключения. Как правило, это GUID клиента. Клиент может отправить эти сведения на сервер в свойстве MFNETSOURCE_PLAYERID .
Клиент отправляет эти сведения на сервер в начале подключения.
Пример значения: "{c579d042-cecc-11d1-bb31-00a0c9603954}"
c-playerversion Номер версии проигрывателя, который отправляется в начале соединения. Клиент может отправить эти сведения на сервер в свойстве MFNETSOURCE_PLAYERVERSION .
Клиент отправляет эти сведения на сервер в начале подключения.
cs(User-Agent) Тип браузера, используемый, если проигрыватель был внедрен в браузер. Это значение может быть задано клиентом в свойстве MFNETSOURCE_BROWSERUSERAGENT .
Если проигрыватель не был внедрен, это поле ссылается на агента пользователя клиента, создающего журнал. В этом случае клиент должен задать свойство MFNETSOURCE_PLAYERUSERAGENT .
Клиент отправляет эти сведения на сервер в начале подключения.
Пример значения: "Mozilla/4.0_(compatible;_MSIE_4.01;_Windows_98)"
cs(Referer) URL-адрес веб-страницы, на которой был внедрен проигрыватель (если он был внедрен). Клиент может отправить эти сведения на сервер в свойстве MFNETSOURCE_BROWSERWEBPAGE .
Клиент отправляет эти сведения на сервер в конце подключения.
Пример значения: "https://www.example.microsoft.com"
c-hostexe Для записей в журнале проигрывателя — ведущая программа (.exe), которая была запущена. Например, веб-страница в браузере, приложение Microsoft Visual Basic или автономный проигрыватель. Клиент может отправить эти сведения на сервер в свойстве MFNETSOURCE_HOSTEXE .
Клиент отправляет эти сведения на сервер в конце подключения.
Примеры значений:
  • "iexplore.exe"
  • "myplayer.exe"
c-hostexever Номер версии ведущего приложения (.exe). Клиент может отправить эти сведения на сервер в свойстве MFNETSOURCE_HOSTVERSION .
Клиент отправляет эти сведения на сервер в конце подключения.

В следующем примере кода показано, как клиентское приложение настраивает сетевой источник. В этом примере задается поле журнала 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;
}

Получение статистики сети

Когда приложение вызывает один из методов сопоставителя источника, оно создает сетевой источник, задает свойства, указанные в хранилище свойств, и открывает сеанс с сервером мультимедиа. В дополнение к настраиваемым сведениям, описанным в предыдущем разделе, дополнительные данные передаются между сервером и клиентом в начале сеанса, во время потоковой передачи и при закрытии сеанса.

Приложение может получать статистику по сети с помощью идентификатора службы MFNETSOURCE_STATISTICS_SERVICE . Чтобы использовать эту службу, приложение может вызвать функцию MFGetService , чтобы получить хранилище свойств, содержащее статистику сети в свойстве MFNETSOURCE_STATISTICS . Конкретные значения можно получить, указав соответствующий идентификатор, определенный в перечислении MFNETSOURCE_STATISTICS_IDS .

В следующем примере кода показано, как использовать службу для получения количества пакетов, полученных клиентом.

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;
}

В следующем списке описаны некоторые идентификаторы статистики сети, определенные в MFNETSOURCE_STATISTICS_IDS.

Идентификатор статистики сети Описание
MFNETSOURCE_AVGBANDWIDTHBPS_ID Средняя пропускная способность (в битах в секунду), с которой клиент был подключен к серверу. Значение вычисляется в течение всего времени подключения.
MFNETSOURCE_BUFFERINGCOUNT_ID Количество буферизации клиента во время воспроизведения потока.
MFNETSOURCE_BYTESRECEIVED_ID Число байтов, полученных клиентом от сервера. Значение не включает в себя накладные расходы, которые добавляются сетевым стеком. Одно и то же содержимое, потоковая передача по разным протоколам, может привести к разным значениям.
MFNETSOURCE_LINKBANDWIDTH_ID Максимальная доступная пропускная способность клиента в битах в секунду.
MFNETSOURCE_LOSTPACKETS_ID Количество пакетов, отправленных сервером, но потерянных во время передачи и никогда не воспроизводимых клиентом. Значение не включает пакеты TCP или UDP.
MFNETSOURCE_RECVPACKETS_ID Число пакетов, полученных от сервера Значение не включает пакеты TCP или UDP.
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID Пакеты, потерянные в сети, которые были восстановлены и восстановлены на клиентском уровне. Это значение не включает пакеты TCP или UDP.
MFNETSOURCE_RESENDSREQUESTED_ID Количество запросов, выполненных клиентом на получение новых пакетов. Это значение не включает пакеты TCP или UDP.
MFNETSOURCE_RECOVEREDPACKETS_ID Количество пакетов, восстановленных из-за того, что они были повторно отправлены через UDP. Это значение не включает пакеты TCP или UDP. Это поле содержит ноль, если клиент не использует повторную отправка UDP.
MFNETSOURCE_BUFFERPROGRESS_ID Процент буфера воспроизведения, заполненного во время буферизации.
MFNETSOURCE_PROTOCOL_ID Протокол, используемый для доступа к потоку. Это может отличаться от протокола, запрошенного клиентом.
MFNETSOURCE_TRANSPORT_ID Транспортный протокол, используемый для доставки потока. Это должен быть UDP или TCP.

Функции источника сети

Сеть в Media Foundation