支援的通訊協定
Media Foundation 支援下列通訊協定:
RTSP (即時串流通訊協定)
RTSP 主要用於串流媒體內容。 它可以使用 UDP 或 TCP 作為傳輸通訊協定。 UDP 是最有效率的內容傳遞,因為頻寬額外負荷小於 TCP 型通訊協定。 雖然 TCP 通訊協定可確保可靠的封包傳遞,但 TCP 不適用於數位媒體串流,其中有效率地使用頻寬比偶爾遺失的封包更為重要。
超文字傳輸通訊協定 (HTTP)
HTTP 會使用 TCP,並由網頁伺服器使用。 「HTTPd://」 配置表示來源可從網頁伺服器下載。 當防火牆設定為接受 HTTP 要求,且通常會拒絕其他串流通訊協定時,也會使用 HTTP。
應用程式可以使用 IMFNetSchemeHandlerConfig 介面,取得 Media Foundation 支援的通訊協定。 若要這樣做,應用程式必須先呼叫 IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols 來擷取通訊協定數目,然後藉由呼叫 IMFNetSchemeHandlerConfig::GetSupportedProtocolType,根據索引取得通訊協定類型。 這個方法會傳回 MFNETSOURCE_PROTOCOL_TYPE 列舉中定義的其中一個值。
應用程式也可以藉由呼叫 MFGetSupportedSchemes 函式來取得來源解析程式所支援的配置。
通訊協定變換
當應用程式將 「mms://」 指定為 URL 配置時,來源解析程式會執行 通訊協定變換 作業。 在此程式中,來源解析程式會決定網路來源用來取得內容的最佳通訊協定。 一般而言,針對媒體串流,RTSP 與 UDP (RTSPU) 比 HTTP 更有效率。 不過,如果內容裝載于網頁伺服器上,HTTP 是較佳的選擇。
當嘗試使用 URL 配置中指定的通訊協定失敗時,也會發生通訊協定變換。 例如,當防火牆封鎖 UDP 封包時,通訊協定可能會失敗。 在此情況下,來源解析程式會切換至 HTTP。
如果 URL 配置包含特定通訊協定,例如「rtspu://」,則不適用通訊協定變換。 此外,如果驗證失敗或伺服器已達到用戶端連線的限制,則不會執行變換。 建議應用程式指定「mms://」配置,並允許來源解析程式為案例選取最佳通訊協定。
下表列出變換順序。
允許的配置 | 通訊協定變換順序 |
---|---|
mms:// 或 rtsp:// | 已啟用快速快取:
|
rtspu:// | RTSPU |
rtspt:// | RTSPT |
https:// |
|
HTTPd:// | HTTPD |
擷取目前的通訊協定
在通訊協定變換作業之後,網路來源可能會使用 URL 配置中應用程式所指定的通訊協定以外的通訊協定。 網路來源與媒體伺服器建立連線之後,應用程式可以使用通訊協定變換結果。
若要取得用於取得內容的通訊協定和傳輸,應用程式可以從網路來源擷取MFNETSOURCE_PROTOCOL屬性的屬性值和IPropertyStore物件的MFNETSOURCE_TRANSPORT屬性。
下列程式碼示範如何取得這些值。
// Create an IPropertyStore object.
IPropertyStore *pProp = NULL;
hr = CreatePropertyStore(&pProp);
PROPVARIANT var;
PropVariantInit(&var);
// Get the property store from the network source.
// The network source is created by the source resolver. Not shown.
if (SUCCEEDED(hr))
{
hr = pNetworkSource->QueryInterface
(__uuidof(IPropertyStore),
(void**)&pProp);
}
if (SUCCEEDED(hr))
{
// Create a property key.
PROPERTYKEY key;
// Get the MFNETSOURCE_PROTOCOL property value.
key.fmtid = MFNETSOURCE_PROTOCOL;
hr = pProp->GetValue (key, &var);
// Get the MFNETSOURCE_TRANSPORT property value.
key.fmtid = MFNETSOURCE_TRANSPORT;
key.pid = 0;
hr = pProp->GetValue (key, &var);
}
在上述範例程式碼中, IPropertyStore::GetValue 會擷取MFNETSOURCE_PROTOCOL值,這是 MFNETSOURCE_PROTOCOL_TYPE 列舉的成員。 對於MFNETSOURCE_TRANSPORT,此值是 MFNETSOURCE_TRANSPORT_TYPE 列舉的成員。
或者,應用程式可以使用MFNETSOURCE_STATISTICS_SERVICE服務來取得相同的值。 若要使用此服務,應用程式可以呼叫 MFGetService 函式,以從網路來源取得屬性存放區。 此屬性存放區包含 MFNETSOURCE_STATISTICS 屬性中的網路統計資料。 藉由指定MFNETSOURCE_PROTOCOL_ID和MFNETSOURCE_TRANSPORT_ID,即可擷取通訊協定和傳輸值,這些值定義于 MFNETSOURCE_STATISTICS_IDS 列舉中。 下列程式碼示範如何使用 MFNETSOURCE_STATISTICS_SERVICE 服務來取得通訊協定和傳輸值。
// Create an IPropertyStore object.
IPropertyStore *pProp = NULL;
hr = CreatePropertyStore(&pProp);
HRESULT hr = S_OK;
hr = MFGetService(
pMediaSource,
MFNETSOURCE_STATISTICS_SERVICE,
IID_IPropertyStore,
(void**) & pProp);
if (SUCCEEDED(hr))
{
// Create a property key.
PROPERTYKEY key;
// Get the property value.
key.fmtid = MFNETSOURCE_STATISTICS;
key.pid = MFNETSOURCE_PROTOCOL_ID;
hr = pProp->GetValue (key, &var);
// Get the transport value.
key.fmtid = MFNETSOURCE_STATISTICS;
key.pid = MFNETSOURCE_TRANSPORT_ID;
hr = pProp->GetValue (key, &var);
}
啟用和停用通訊協定
應用程式可以設定網路來源,以便在變換程式期間略過特定通訊協定。 若要這樣做,網路來源屬性是用來停用特定通訊協定。 下表顯示其所控制的屬性和通訊協定。
屬性 | 描述 |
---|---|
MFNETSOURCE_ENABLE_HTTP | 啟用或停用 HTTP 和 HTTPD。 |
MFNETSOURCE_ENABLE_RTSP | 啟用或停用 RTSPU 和 RTSPT。 |
MFNETSOURCE_ENABLE_TCP | 啟用或停用 RTSPT。 |
MFNETSOURCE_ENABLE_UDP | 啟用或停用 RTSPU。 |
MFNETSOURCE_ENABLE_DOWNLOAD | 啟用或停用 HTTPD。 |
MFNETSOURCE_ENABLE_STREAMING | 啟用或停用 RTSPU、RTSPT 和 HTTP。 |
相關主題