支持的协议

Media Foundation 支持以下协议:

  • 实时流式处理协议 (RTSP)

    RTSP 主要用于流式传输媒体内容。 它可以使用 UDP 或 TCP 作为传输协议。 UDP 是内容传递效率最高的,因为带宽开销小于基于 TCP 的协议。 尽管 TCP 协议可确保可靠的数据包传送,但 TCP 不适合数字媒体流,而有效使用带宽比偶尔丢失的数据包更重要。

  • 超文本传输协议 (HTTP)

    HTTP 使用 TCP,并由 Web 服务器使用。 “httpd://”方案指示源可从 Web 服务器下载。 如果防火墙通常配置为接受 HTTP 请求,并且通常拒绝其他流式处理协议,则也会使用 HTTP。

应用程序可以使用 IMFNetSchemeHandlerConfig 接口获取 Media Foundation 支持的协议。 为此,应用程序必须首先通过调用 IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols 来检索协议数,然后通过调用 IMFNetSchemeHandlerConfig::GetSupportedProtocolType 获取基于索引的协议类型。 此方法返回 MFNETSOURCE_PROTOCOL_TYPE 枚举中定义的值之一。

应用程序还可以通过调用 MFGetSupportedSchemes 函数来获取源解析程序支持的方案。

协议滚动更新

当应用程序将“mms://”指定为 URL 方案时,源解析程序将执行 协议滚动更新 操作。 在此过程中,源解析程序确定用于获取内容的网络源的最佳协议。 通常,对于媒体热流,使用 UDP (RTSPU) 的 RTSP 比 HTTP 更高效。 但是,如果内容托管在 Web 服务器上,则 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_STATISTICS_IDS 枚举中定义的MFNETSOURCE_PROTOCOL_ID和MFNETSOURCE_TRANSPORT_ID来检索协议和传输值。 以下代码演示如何使用 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。

 

媒体基础中的网络