支援的通訊協定
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 屬性 MFNETSOURCE_TRANSPORT 和 IPropertyStore 物件的屬性值。
下列程式代碼示範如何取得這些值。
// 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。 |
相關主題
-
媒體基礎 網路