支持的协议
Media Foundation 支持以下协议:
实时流式处理协议 (RTSP)
RTSP 主要用于流媒体内容。 它可以使用 UDP 或 TCP 作为传输协议。 UDP 是内容传递效率最高的,因为带宽开销比基于 TCP 的协议要小。 尽管 TCP 协议可确保可靠的数据包传送,但 TCP 并不适合数字媒体流,因为数字媒体流的有效使用带宽比偶尔丢失的数据包更重要。
超文本传输协议 (HTTP)
HTTP 使用 TCP,由 Web 服务器使用。 “httpd://”方案指示可从 Web 服务器下载源。 HTTP 还用于防火墙,防火墙通常配置为接受 HTTP 请求,并且通常拒绝其他流式处理协议。
应用程序可以使用 IMFNetSchemeHandlerConfig 接口获取媒体基础支持的协议。 为此,应用程序必须首先通过调用 IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols 来检索协议数,然后通过调用 IMFNetSchemeHandlerConfig::GetSupportedProtocolType 根据索引获取协议类型。 此方法返回 在 MFNETSOURCE_PROTOCOL_TYPE 枚举中定义的值之一。
应用程序还可以通过调用 MFGetSupportedSchemes 函数来获取源解析程序支持的方案。
协议滚动更新
当应用程序指定“mms://”作为 URL 方案时,源解析程序将执行 协议滚动更新 操作。 在此过程中,源解析程序确定网络源用于获取内容的最佳协议。 通常,使用 UDP (RTSPU) 的 RTSP 比 HTTP 更高效。 但是,如果内容托管在 Web 服务器上,则 HTTP 是更好的选择。
尝试使用 URL 方案中指定的协议失败时,也会发生协议滚动更新。 例如,当防火墙阻止 UDP 数据包时,协议可能会失败。 在这种情况下,源解析程序将切换到 HTTP。
如果 URL 方案包含特定协议(例如“rtspu://”),则协议滚动更新不适用。 此外,如果身份验证失败或服务器已达到客户端连接限制,则不会执行滚动更新。 建议应用程序指定“mms://”方案,并允许源解析程序为方案选择最佳协议。
下表列出了滚动更新顺序。
允许的方案 | 协议滚动更新顺序 |
---|---|
mms:// 或 rtsp:// | 已启用快速缓存:
|
rtspu:// | RTSPU |
rtspt:// | RTSPT |
https:// |
|
httpd:// | HTTPD |
检索当前协议
执行协议滚动更新操作后,网络源可能使用 URL 方案中应用程序指定的协议以外的协议。 在网络源与媒体服务器建立连接后,应用程序可以使用协议滚动更新结果。
若要获取用于获取内容的协议和传输,应用程序可以从网络源检索 IPropertyStore 对象的 MFNETSOURCE_PROTOCOL 属性和 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。 |
相关主题