Clientprotokollierung (Microsoft Media Foundation)
Die Netzwerkquelle unterstützt die Clientprotokollierung, die dem Medienserver eine Möglichkeit bietet, die Aktivität der Clients nachzuverfolgen, die eine Verbindung mit ihr herstellen. Clientprotokolle ermöglichen es einem Server, Verbindungs-, Rendering- und Streamingstatistiken aufzuzeichnen. Diese Protokolle können von Inhaltsanbietern in verschiedenen Szenarien verwendet werden, z. B. zum Nachverfolgen der Medienservernutzung und zum Generieren von Abrechnungen oder zum Bereitstellen von Inhalten in geeigneter Qualität, abhängig von der Geschwindigkeit des Netzwerks des Clients.
Eine Protokolldatei enthält mehrere Clientereigniseinträge. Jeder Protokolleintrag enthält eine Reihe leergetrennter Felder. Es gibt zwei Arten von Clientprotokollen: Rendering (Wiedergabe) und Streaming (Empfangen). Da Inhalte gleichzeitig wiedergegeben und gestreamt werden können, kann der Client eine Kombination aus beiden Protokolldatentypen senden. In bestimmten Fällen können zwei Protokolleinträge für dieselbe Sitzung vorhanden sein. Wenn z. B. Fast Cache aktiviert ist, kann der Client den Empfang des gestreamten Inhalts abschließen, bevor er das Rendern abgeschlossen hat. In diesem Fall würden die Streamingprotokolldaten vor den Renderingprotokolldaten gesendet.
Der Client sendet Renderingprotokolldaten an den Server, wenn der Client von einem beliebigen Wiedergabezustand (Wiedergabe, Fast-Forward oder Zurückspulen) in einen nicht wiedergegebenen Zustand wechselt (Beenden, Anhalten, Ende des Datenstroms und Beginn des Datenstroms). Wenn Daten für ein Renderingprotokoll übermittelt werden, wird direkt eine Verbindung mit dem Medienserver oder einem konfigurierten Proxyserver hergestellt.
Wenn der Inhalt in einer temporären lokalen Cachedatei auf dem Computer gespeichert ist, auf dem der Client ausgeführt wird, kann der Client eine Datei aus dem lokalen Cache lesen und die Renderingprotokolldaten übermitteln, um anzugeben, dass er den Inhalt wiedergegeben hat. In diesem Fall liest der Client eine Datei aus dem lokalen Cache, der Renderingprotokolleintrag enthält keine Netzwerkstatistiken, und das Protokoll ist auf Cache festgelegt.
Der Client sendet Streamingprotokolldaten an den Server, um anzugeben, wie der Client den Inhalt empfangen hat, aber nicht, wie er gerendert wurde. Der Client kann das Streamingprotokoll senden, lange bevor der Client das Rendern des Inhalts abgeschlossen hat.
Dieses Thema enthält keine Informationen zu allen Protokollfeldern. Eine vollständige Referenz finden Sie unter Windows Media-Protokolldatenstruktur.
Konfigurieren von Protokollfeldern
Media Foundation ermöglicht es dem Client, die Netzwerkquelle mithilfe von Eigenschaften zu konfigurieren. Die Anwendung muss die entsprechenden Eigenschaften in einem Eigenschaftenspeicher festlegen und an eine der Quelllösermethoden übergeben. Der Quelllöser erstellt die Netzwerkquelle wie angefordert und öffnet eine Verbindung mit dem Server. Wenn die Verbindung erfolgreich ist, sendet der Client Informationen über sich selbst.
In der folgenden Tabelle werden die Protokollfelder und die entsprechenden Eigenschaften beschrieben, die eine Anwendung über den Quelllöser festlegen kann. Diese Informationen ändern sich während der Sitzung nicht.
Protokollierungsfeld | BESCHREIBUNG |
---|---|
c-playerid | Eindeutige Identifikation des Spielers. Diese Informationen werden am Anfang der Verbindung gesendet. In der Regel handelt es sich hierbei um eine GUID des Clients. Der Client kann diese Informationen in der eigenschaft MFNETSOURCE_PLAYERID an den Server senden. Der Client sendet diese Informationen zu Beginn der Verbindung an den Server. Beispielwert: "{c579d042-cecc-11d1-bb31-00a0c9603954}" |
c-playerversion | Die Versionsnummer des Players, die am Anfang der Verbindung gesendet wird. Der Client kann diese Informationen in der eigenschaft MFNETSOURCE_PLAYERVERSION an den Server senden. Der Client sendet diese Informationen zu Beginn der Verbindung an den Server. |
cs(User-Agent) | Browsertyp, der verwendet wird, wenn der Player in einen Browser eingebettet wurde. Dieser Wert kann vom Client in der eigenschaft MFNETSOURCE_BROWSERUSERAGENT festgelegt werden. Wenn der Player nicht eingebettet wurde, bezieht sich dieses Feld auf den Benutzer-Agent des Clients, der das Protokoll generiert hat. In diesem Fall muss der Client die eigenschaft MFNETSOURCE_PLAYERUSERAGENT festlegen. Der Client sendet diese Informationen zu Beginn der Verbindung an den Server. Beispielwert: "Mozilla/4.0_(compatible;_MSIE_4.01;_Windows_98)" |
cs(Referer) | URL der Webseite, auf der der Player eingebettet wurde (sofern eingebettet). Der Client kann diese Informationen in der eigenschaft MFNETSOURCE_BROWSERWEBPAGE an den Server senden. Der Client sendet diese Informationen am Ende der Verbindung an den Server. Beispielwert: "https://www.example.microsoft.com" |
c-hostexe | Bei Playerprotokolleinträgen wird das ausgeführte Hostprogramm (.exe) ausgeführt. Beispielsweise eine Webseite in einem Browser, ein Microsoft Visual Basic-Applet oder ein eigenständiger Player. Der Client kann diese Informationen an den Server in der eigenschaft MFNETSOURCE_HOSTEXE senden. Der Client sendet diese Informationen am Ende der Verbindung an den Server. Beispielwerte:
|
c-hostexever | Versionsnummer des Hostprogramms (.exe). Der Client kann diese Informationen in der Eigenschaft MFNETSOURCE_HOSTVERSION an den Server senden. Der Client sendet diese Informationen am Ende der Verbindung an den Server. |
Das folgende Codebeispiel zeigt, wie eine Clientanwendung die Netzwerkquelle konfiguriert. In diesem Beispiel wird das Protokollfeld "c-hostexe" festgelegt.
// 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;
}
Abrufen von Netzwerkstatistiken
Wenn die Anwendung eine der Quelllösermethoden aufruft, erstellt sie die Netzwerkquelle, legt die im Eigenschaftenspeicher angegebenen Eigenschaften fest und öffnet eine Sitzung mit dem Medienserver. Zusätzlich zu den konfigurierbaren Informationen, die im vorherigen Abschnitt beschrieben wurden, werden zu Beginn der Sitzung, während des Streamings und beim Schließen der Sitzung zusätzliche Daten zwischen dem Server und dem Client übertragen.
Die Anwendung kann Netzwerkstatistiken mithilfe des MFNETSOURCE_STATISTICS_SERVICE Dienstbezeichners abrufen. Um diesen Dienst zu verwenden, kann die Anwendung die MFGetService-Funktion aufrufen, um den Eigenschaftenspeicher abzurufen, der Netzwerkstatistiken in der MFNETSOURCE_STATISTICS-Eigenschaft enthält. Bestimmte Werte können abgerufen werden, indem Sie den entsprechenden Bezeichner angeben, der in der MFNETSOURCE_STATISTICS_IDS-Enumeration definiert ist.
Das folgende Codebeispiel zeigt, wie Sie den Dienst verwenden, um die Anzahl der vom Client empfangenen Pakete abzurufen.
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;
}
In der folgenden Liste werden einige der Netzwerkstatistikbezeichner beschrieben, die in MFNETSOURCE_STATISTICS_IDS definiert sind.
Netzwerkstatistikbezeichner | BESCHREIBUNG |
---|---|
MFNETSOURCE_AVGBANDWIDTHBPS_ID | Durchschnittliche Bandbreite (in Bits pro Sekunde), bei der der Client mit dem Server verbunden war. Der Wert wird über die gesamte Dauer der Verbindung berechnet. |
MFNETSOURCE_BUFFERINGCOUNT_ID | Anzahl der Puffer des Clients während der Wiedergabe des Datenstroms. |
MFNETSOURCE_BYTESRECEIVED_ID | Anzahl der Bytes, die vom Client vom Server empfangen werden. Der Wert enthält keinen Mehraufwand, der vom Netzwerkstapel hinzugefügt wird. Derselbe Inhalt, der mit unterschiedlichen Protokollen gestreamt wird, kann zu unterschiedlichen Werten führen. |
MFNETSOURCE_LINKBANDWIDTH_ID | Die maximale verfügbare Bandbreite des Clients in Bits pro Sekunde. |
MFNETSOURCE_LOSTPACKETS_ID | Anzahl der Pakete, die vom Server gesendet werden, aber während der Übertragung verloren gegangen sind und nie vom Client wiedergegeben werden. Der Wert enthält keine TCP- oder UDP-Pakete. |
MFNETSOURCE_RECVPACKETS_ID | Anzahl der vom Server empfangenen Pakete Der Wert enthält keine TCP- oder UDP-Pakete. |
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID | Im Netzwerk verlorene Pakete, die auf Clientebene repariert und wiederhergestellt wurden. Dieser Wert enthält keine TCP- oder UDP-Pakete. |
MFNETSOURCE_RESENDSREQUESTED_ID | Die Anzahl der Anforderungen, die vom Client zum Empfangen neuer Pakete gestellt werden. Dieser Wert enthält keine TCP- oder UDP-Pakete. |
MFNETSOURCE_RECOVEREDPACKETS_ID | Anzahl der Pakete, die wiederhergestellt wurden, weil sie über UDP erneut gesendet wurden. Dieser Wert enthält keine TCP- oder UDP-Pakete. Dieses Feld enthält eine Null, es sei denn, der Client verwendet udp resend. |
MFNETSOURCE_BUFFERPROGRESS_ID | Der Prozentsatz des während der Pufferung gefüllten Ausspielpuffers. |
MFNETSOURCE_PROTOCOL_ID | Das Protokoll, das für den Zugriff auf den Stream verwendet wird. Dies kann sich von dem vom Client angeforderten Protokoll unterscheiden. |
MFNETSOURCE_TRANSPORT_ID | Transportprotokoll, das zum Übermitteln des Datenstroms verwendet wird. Dies muss entweder UDP oder TCP sein. |