共用方式為


支援的通訊協定

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. RTSP with TCP (RTSPT)
  2. RTSP with UDP (RTSPU)
  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 屬性 MFNETSOURCE_TRANSPORTIPropertyStore 物件的屬性值。

下列程式代碼示範如何取得這些值。

// 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。

 

媒體基礎 網路