クライアント ログ (Microsoft Media Foundation)

ネットワーク ソースでは、クライアント ログがサポートされています。これにより、メディア サーバーが接続するクライアントのアクティビティを追跡できます。 クライアント ログを使用すると、サーバーは接続、レンダリング、ストリーミングの統計情報を記録できます。 これらのログは、メディア サーバーの使用状況をトレースして課金を生成したり、クライアントのネットワークの速度に応じて適切な品質のコンテンツを配信したりするなど、さまざまなシナリオでコンテンツ プロバイダーによって使用できます。

ログ ファイルには、いくつかのクライアント イベント エントリが含まれています。 各ログ エントリには、スペース区切りのフィールドが多数含まれています。 クライアント ログには、 レンダリング (再生) と ストリーミング (受信) の 2 種類があります。 コンテンツは同時に再生およびストリーミングできるため、クライアントは両方の種類のログ データの組み合わせを送信できます。 場合によっては、同じセッションに対して 2 つのログ エントリが存在する可能性があります。 たとえば、高速キャッシュが有効になっている場合、クライアントはストリーミングコンテンツのレンダリングを完了する前に受信を完了できます。 その場合、ストリーミング ログ データは、レンダリング ログ データの前に送信されます。

クライアントは、再生状態 (再生、fast-forward、または巻き戻し) から再生されていない状態 (停止、一時停止、ストリームの終了、およびストリームの開始) にクライアントが変更されたときに、レンダリング ログ データをサーバーに送信します。 レンダリング ログのデータが送信されると、メディア サーバーまたは構成済みのプロキシ サーバーに直接接続されます。

クライアントを実行しているコンピューター上の一時ローカル キャッシュ ファイルにコンテンツが格納されている場合、クライアントはローカル キャッシュからファイルを読み取り、レンダリング ログ データを送信して、コンテンツが再生されたことを示すことができます。 この場合、クライアントはローカル キャッシュからファイルを読み取り、レンダリング ログ エントリにはネットワーク統計は含まれません。プロトコルは [キャッシュ] に設定されます。

クライアントはストリーミング ログ データをサーバーに送信して、クライアントがコンテンツを受け取った方法を示しますが、レンダリング方法は示しません。 クライアントは、クライアントがコンテンツのレンダリングを完了するずっと前にストリーミング ログを送信できます。

このトピックでは、すべてのログ フィールドに関する情報を提供しません。 完全なリファレンスについては、「 Windows Media Log データ構造」を参照してください。

ログ フィールドの構成

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) プレーヤーが埋め込まれた Web ページの URL (埋め込まれている場合)。 クライアントは、この情報を MFNETSOURCE_BROWSERWEBPAGE プロパティでサーバーに送信できます。
クライアントは、接続の最後にサーバーにこの情報を送信します。
サンプル値: "https://www.example.microsoft.com"
c-hostexe プレーヤー ログ エントリの場合は、実行されたホスト プログラム (.exe)。 たとえば、ブラウザー内の Web ページ、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 クライアントがサーバーに接続された平均帯域幅 (1 秒あたりのビット数)。 この値は、接続の全期間にわたって計算されます。
MFNETSOURCE_BUFFERINGCOUNT_ID ストリームの再生中にクライアントがバッファーに入れられた回数。
MFNETSOURCE_BYTESRECEIVED_ID サーバーからクライアントが受信したバイト数。 値には、ネットワーク スタックによって追加されるオーバーヘッドは含まれません。 異なるプロトコルを使用して同じコンテンツがストリーミングされると、値が異なる可能性があります。
MFNETSOURCE_LINKBANDWIDTH_ID クライアントの使用可能な最大帯域幅 (1 秒あたりのビット数)。
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 再送信を使用している場合を除き、このフィールドには 0 が含まれます。
MFNETSOURCE_BUFFERPROGRESS_ID バッファリング中に入力された再生バッファーの割合。
MFNETSOURCE_PROTOCOL_ID ストリームへのアクセスに使用されるプロトコル。 これは、クライアントによって要求されたプロトコルとは異なる場合があります。
MFNETSOURCE_TRANSPORT_ID ストリームの配信に使用されるトランスポート プロトコル。 これは UDP または TCP である必要があります。

ネットワーク ソースの機能

Media Foundation でのネットワーク