Microsoft Media Foundation) (客户端日志记录
网络源支持客户端日志记录,这为媒体服务器提供了一种方法来跟踪连接到它的客户端的活动。 客户端日志使服务器能够记录连接、呈现和流式处理统计信息。 内容提供商可以在各种方案中使用这些日志来跟踪媒体服务器使用情况并生成计费,或者根据客户端网络的速度提供适当质量的内容。
日志文件包含多个客户端事件条目。 每个日志条目都包含一些空格分隔的字段。 有两种类型的客户端日志: 呈现 (播放) 和 流式处理 (接收) 。 由于内容可以同时播放和流式传输,因此客户端可以发送这两种类型的日志数据的组合。 在某些情况下,同一会话可以存在两个日志条目。 例如,启用“快速缓存”后,客户端可以在完成呈现之前完成流式处理内容的接收。 在这种情况下,流式处理日志数据将在呈现日志数据之前发送。
当客户端从任何播放状态 (播放、快进或倒退) 更改为非播放状态时,客户端会将呈现日志数据发送到服务器, (停止、暂停、流结束和流) 开始。 提交呈现日志的数据时,将直接连接到媒体服务器或配置的代理服务器。
如果内容存储在运行客户端的计算机上的临时本地缓存文件中,则客户端可以从其本地缓存中读取文件并提交呈现日志数据,以指示它已播放内容。 在这种情况下,客户端从其本地缓存读取文件,呈现日志条目不包含任何网络统计信息,并且协议设置为缓存。
客户端将流式处理日志数据发送到服务器,以指示客户端接收内容的方式,而不是其呈现方式。 客户端可以在客户端完成内容呈现之前发送流式处理日志。
本主题不提供有关所有日志字段的信息。 有关完整参考,请参阅 Windows 媒体日志数据结构。
配置日志字段
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 (引用) | 如果玩家已嵌入) ,则 (在其中嵌入的网页的 URL。 客户端可以在 MFNETSOURCE_BROWSERWEBPAGE 属性中将此信息发送到服务器。 客户端在连接结束时将此信息发送到服务器。 示例值:“https://www.example.microsoft.com" |
c-hostexe | 对于玩家日志条目,主机程序 (.exe) 运行。 例如,浏览器中的网页、Microsoft Visual Basic 小程序或独立播放器。 客户端可以将此信息发送到 MFNETSOURCE_HOSTEXE 属性中的服务器。 客户端在连接结束时将此信息发送到服务器。 示例值:
|
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。 |