Journalisation des clients (Microsoft Media Foundation)

La source réseau prend en charge la journalisation des clients, qui permet au serveur multimédia de suivre l’activité des clients qui s’y connectent. Les journaux clients permettent à un serveur d’enregistrer les statistiques de connexion, de rendu et de streaming. Ces journaux peuvent être utilisés par les fournisseurs de contenu dans différents scénarios, par exemple, pour suivre l’utilisation du serveur multimédia et générer la facturation, ou pour fournir un contenu de qualité adaptée en fonction de la vitesse du réseau du client.

Un fichier journal contient plusieurs entrées d’événements client. Chaque entrée de journal contient un certain nombre de champs délimités par l’espace. Il existe deux types de journaux clients : le rendu (lecture) et le streaming (réception). Étant donné que le contenu peut être lu et diffusé simultanément, le client peut envoyer une combinaison des deux types de données de journal. Dans certains cas, deux entrées de journal peuvent exister pour la même session. Par exemple, lorsque le cache rapide est activé, le client peut terminer de recevoir le contenu diffusé avant de terminer son rendu. Dans ce cas, les données du journal de streaming sont envoyées avant les données du journal de rendu.

Le client envoie les données de journal de rendu au serveur lorsque le client passe d’un état de lecture (lecture, avance rapide ou rembobinage) à un état non lu (arrêt, pause, fin du flux et début du flux). Lorsque les données d’un journal de rendu sont envoyées, une connexion est établie directement au serveur multimédia ou à un serveur proxy configuré.

Si le contenu est stocké dans un fichier de cache local temporaire sur l’ordinateur qui exécute le client, le client peut lire un fichier à partir de son cache local et envoyer les données du journal de rendu pour indiquer qu’il a lu le contenu. Dans ce cas, le client lit un fichier à partir de son cache local, l’entrée du journal de rendu ne contient aucune statistique réseau et le protocole est défini sur Cache.

Le client envoie des données de journal de streaming au serveur pour indiquer comment le client a reçu le contenu, mais pas comment il a été rendu. Le client peut envoyer le journal de diffusion en continu bien avant que le client ne termine le rendu du contenu.

Cette rubrique ne fournit pas d’informations sur tous les champs de journal. Pour obtenir une référence complète, consultez Structure des données du journal Windows Media.

Configuration des champs de journal

Media Foundation permet au client de configurer la source réseau à l’aide de propriétés. L’application doit définir les propriétés appropriées dans un magasin de propriétés et les passer à l’une des méthodes du programme de résolution source. Le programme de résolution source crée la source réseau comme demandé et ouvre une connexion avec le serveur. Si la connexion réussit, le client envoie des informations sur lui-même.

Le tableau suivant décrit les champs de journal et les propriétés correspondantes qu’une application peut définir via le programme de résolution source. Ces informations ne changent pas pendant la session.

Champ journalisation Description
c-playerid Identification unique du joueur. Ces informations sont envoyées au début de la connexion. En règle générale, il s’agit d’un GUID du client. Le client peut envoyer ces informations au serveur dans la propriété MFNETSOURCE_PLAYERID .
Le client envoie ces informations au serveur au début de la connexion.
Exemple de valeur : « {c579d042-cecc-11d1-bb31-00a0c9603954} »
c-playerversion Numéro de version du lecteur envoyé au début de la connexion. Le client peut envoyer ces informations au serveur dans la propriété MFNETSOURCE_PLAYERVERSION .
Le client envoie ces informations au serveur au début de la connexion.
cs(User-Agent) Type de navigateur utilisé si le lecteur a été incorporé dans un navigateur. Cette valeur peut être définie par le client dans la propriété MFNETSOURCE_BROWSERUSERAGENT .
Si le lecteur n’a pas été incorporé, ce champ fait référence à l’agent utilisateur du client qui a généré le journal. Dans ce cas, le client doit définir la propriété MFNETSOURCE_PLAYERUSERAGENT .
Le client envoie ces informations au serveur au début de la connexion.
Exemple de valeur : « Mozilla/4.0_(compatible;_MSIE_4.01;_Windows_98) »
cs(Referer) URL de la page web dans laquelle le lecteur a été incorporé (le cas échéant). Le client peut envoyer ces informations au serveur dans la propriété MFNETSOURCE_BROWSERWEBPAGE .
Le client envoie ces informations au serveur à la fin de la connexion.
Exemple de valeur : "https://www.example.microsoft.com" ;
c-hostexe Pour les entrées de journal du joueur, le programme hôte (.exe) qui a été exécuté. Par exemple, une page web dans un navigateur, une applet Microsoft Visual Basic ou un lecteur autonome. Le client peut envoyer ces informations au serveur dans la propriété MFNETSOURCE_HOSTEXE .
Le client envoie ces informations au serveur à la fin de la connexion.
Exemples de valeurs :
  • « iexplore.exe »
  • « myplayer.exe »
c-hostexever Numéro de version du programme hôte (.exe). Le client peut envoyer ces informations au serveur dans la propriété MFNETSOURCE_HOSTVERSION .
Le client envoie ces informations au serveur à la fin de la connexion.

L’exemple de code suivant montre comment une application cliente configure la source réseau. Cet exemple montre comment définir le champ de journal « 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;
}

Récupération des statistiques réseau

Lorsque l’application appelle l’une des méthodes de résolution source, elle crée la source réseau, définit les propriétés spécifiées dans le magasin de propriétés et ouvre une session avec le serveur multimédia. En plus des informations configurables décrites dans la section précédente, des données supplémentaires sont transférées entre le serveur et le client au début de la session, pendant la diffusion en continu et lorsque la session est fermée.

L’application peut récupérer des statistiques réseau à l’aide de l’identificateur de service MFNETSOURCE_STATISTICS_SERVICE . Pour utiliser ce service, l’application peut appeler la fonction MFGetService pour obtenir le magasin de propriétés qui contient des statistiques réseau dans la propriété MFNETSOURCE_STATISTICS . Des valeurs spécifiques peuvent être récupérées en fournissant l’identificateur correspondant défini dans l’énumération MFNETSOURCE_STATISTICS_IDS .

L’exemple de code suivant montre comment utiliser le service pour obtenir le nombre de paquets reçus par le client.

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

La liste suivante décrit certains des identificateurs de statistiques réseau définis dans MFNETSOURCE_STATISTICS_IDS.

Identificateur de statistiques réseau Description
MFNETSOURCE_AVGBANDWIDTHBPS_ID Bande passante moyenne (en bits par seconde) à laquelle le client a été connecté au serveur. La valeur est calculée sur toute la durée de la connexion.
MFNETSOURCE_BUFFERINGCOUNT_ID Nombre de fois que le client a mis en mémoire tampon pendant la lecture du flux.
MFNETSOURCE_BYTESRECEIVED_ID Nombre d’octets reçus par le client à partir du serveur. La valeur n’inclut aucune surcharge ajoutée par la pile réseau. Le même contenu diffusé en continu à l’aide de protocoles différents peut entraîner des valeurs différentes.
MFNETSOURCE_LINKBANDWIDTH_ID Bande passante maximale disponible du client en bits par seconde.
MFNETSOURCE_LOSTPACKETS_ID Nombre de paquets envoyés par le serveur mais perdus pendant la transmission et jamais lus par le client. La valeur n’inclut pas les paquets TCP ou UDP.
MFNETSOURCE_RECVPACKETS_ID Nombre de paquets reçus du serveur La valeur n’inclut pas les paquets TCP ou UDP.
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID Paquets perdus dans le réseau qui ont été réparés et récupérés au niveau de la couche cliente. Cette valeur n’inclut pas les paquets TCP ou UDP.
MFNETSOURCE_RESENDSREQUESTED_ID Nombre de demandes effectuées par le client pour recevoir de nouveaux paquets. Cette valeur n’inclut pas les paquets TCP ou UDP.
MFNETSOURCE_RECOVEREDPACKETS_ID Nombre de paquets récupérés, car ils ont été renvoyés via UDP. Cette valeur n’inclut pas les paquets TCP ou UDP. Ce champ contient un zéro, sauf si le client utilise le renvoi UDP.
MFNETSOURCE_BUFFERPROGRESS_ID Pourcentage de la mémoire tampon de lecture remplie pendant la mise en mémoire tampon.
MFNETSOURCE_PROTOCOL_ID Protocole utilisé pour accéder au flux. Cela peut différer du protocole demandé par le client.
MFNETSOURCE_TRANSPORT_ID Protocole de transport utilisé pour remettre le flux. Il doit s’agir d’UDP ou tcp.

Fonctionnalités de la source réseau

Mise en réseau dans Media Foundation