用戶端記錄 (Microsoft Media Foundation)
網路來源支援用戶端記錄,其提供一種方式讓媒體伺服器追蹤與其連線的用戶端活動。 用戶端記錄可讓伺服器記錄連線、轉譯和串流統計資料。 這些記錄可由內容提供者在各種案例中使用,例如追蹤媒體伺服器使用量並產生計費,或根據用戶端網路的速度提供適當的品質內容。
記錄檔包含數個用戶端事件專案。 每個記錄專案都包含一些以空格分隔的欄位。 用戶端記錄有兩種類型: 轉 譯 (播放) 和 串流 (接收) 。 因為可以同時播放和串流內容,所以用戶端可以傳送這兩種類型的記錄資料的組合。 在某些情況下,同一個會話可以存在兩個記錄專案。 例如,啟用快速快取時,用戶端可以在完成轉譯之前完成接收串流內容。 在此情況下,串流記錄資料會在轉譯記錄資料之前傳送。
當用戶端從任何播放狀態 (播放、快速轉送或倒轉) 變更為非播放狀態時,用戶端會將轉譯記錄資料傳送至伺服器, (停止、暫停、串流結束,以及資料流程開頭) 。 提交轉譯記錄的資料時,會直接連線到媒體伺服器或已設定的 Proxy 伺服器。
如果內容儲存在執行用戶端的電腦上暫存本機快取檔案中,用戶端可以從其本機快取讀取檔案,並提交轉譯記錄資料,以指出它已播放內容。 在此情況下,用戶端會從其本機快取讀取檔案、轉譯記錄專案不包含任何網路統計資料,而且通訊協定會設定為快取。
用戶端會將串流記錄資料傳送至伺服器,以指出用戶端接收內容的方式,但無法指出其轉譯方式。 用戶端可以在用戶端完成轉譯內容之前,傳送串流記錄檔。
本主題不提供所有記錄欄位的相關資訊。 如需完整參考,請參閱 Windows 媒體記錄資料結構。
設定記錄欄位
媒體基礎可讓用戶端使用屬性來設定網路來源。 應用程式必須在屬性存放區中設定適當的屬性,並將它傳遞至其中一個來源解析程式方法。 來源解析程式會依照要求建立網路來源,並開啟與伺服器的連線。 如果連線成功,用戶端會傳送本身的相關資訊。
下表描述記錄欄位,以及應用程式可透過來源解析程式設定的對應屬性。 此資訊不會在會話期間變更。
記錄欄位 | 描述 |
---|---|
c-playerid | 玩家的唯一識別。 這項資訊會在連線開始時傳送。 一般而言,這是用戶端的 GUID。 用戶端可以將此資訊傳送至 MFNETSOURCE_PLAYERID 屬性中的伺服器。 用戶端會在連線開始時將此資訊傳送至伺服器。 範例值:「{c579d042-cecc-11d1-bb31-00a0c9603954}」 |
c-playerversion | 在連線開始時傳送的播放機版本號碼。 用戶端可以將此資訊傳送至 MFNETSOURCE_PLAYERVERSION 屬性中的伺服器。 用戶端會在連線開始時將此資訊傳送至伺服器。 |
cs (User-Agent) | 如果播放機內嵌在瀏覽器中,則會使用瀏覽器類型。 這個值可由用戶端在 MFNETSOURCE_BROWSERUSERAGENT 屬性中設定。 如果播放機未內嵌,此欄位會參考產生記錄檔之用戶端的使用者代理程式。 在此情況下,用戶端必須設定 MFNETSOURCE_PLAYERUSERAGENT 屬性。 用戶端會在連線開始時將此資訊傳送至伺服器。 範例值:「Mozilla/4.0_ (相容;_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。 |