網路來源支援客戶端記錄,這為媒體伺服器追蹤與其連線之客戶端的活動提供了一種方式。 用戶端記錄可讓伺服器記錄連線、轉譯和串流統計數據。 這些記錄可供內容提供者在各種案例中使用,例如追蹤媒體伺服器使用量併產生計費,或根據客戶端網路的速度提供適當的質量內容。
記錄檔包含數個用戶端事件項目。 每個日誌條目都包含一些以空格分隔的欄位。 客戶端記錄有兩種類型:轉譯(播放)和 串流(接收)。 因為內容可以同時播放和串流,用戶端可以傳送這兩種類型的記錄數據的組合。 在某些情況下,同一個會話可能會有兩個日誌條目存在。 例如,啟用快速快取時,用戶端可以在完成轉譯之前完成接收串流內容。 在此情況下,串流記錄數據會在轉譯記錄數據之前傳送。
當用戶端從任何播放狀態(播放、快速轉送或倒轉)變更為非播放狀態時,用戶端會將轉譯記錄數據傳送至伺服器(停止、暫停、數據流結束和數據流開頭)。 提交轉譯記錄檔的數據時,會直接連線到媒體伺服器或已設定的 Proxy 伺服器。
如果內容儲存在執行客戶端的計算機上暫存本機快取檔案中,用戶端可以從其本機快取讀取檔案,並提交轉譯記錄數據,以指出它已播放內容。 在此情況下,客戶端會從本機快取讀取檔案;渲染日誌條目不包含任何網路統計數據,且通訊協定設定為快取。
用戶端會將串流記錄數據傳送至伺服器,以指出用戶端如何接收內容,但無法指出其轉譯方式。 用戶端可以在用戶端完成轉譯內容之前,傳送串流記錄。
本主題不提供所有記錄欄位的相關信息。 如需完整參考,請參閱 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。 |