支援的通訊協定

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:// 已啟用快速快取:
  1. 具有 TCP (RTSPT) 的 RTSP
  2. 具有 UDP (RTSPU) 的 RTSP
  3. HTTP 串流
  4. HTTP 下載 (HTTPD)
快速快取已停用:
  1. RTSPU
  2. RTSPT
  3. HTTP 串流
  4. HTTP 下載
rtspu:// RTSPU
rtspt:// RTSPT
https://
  1. HTTP
  2. HTTPD
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。

 

媒體基礎中的網路功能