网络源功能
网络源为流媒体文件提供基本实现,并公开 IMFMediaSource 接口。 特定的网络源实现取决于用于打开源(如 RTSP 或 HTTP)的协议。 特定于协议的网络源扩展了基本网络功能。 有关支持的方案和协议的信息,请参阅 支持的协议。
网络源:
- 实现缓存、代理检测和自动重新连接等功能。
- 将独立于协议的调用从源解析程序转换为特定于协议的调用。
- 与套接字层和作系统交互。 分析 SDP 说明并将其用作配置数据,并从基础套接字层读取流数据。 接收时,网络源负责重新排序和请求重新传输数据包。
网络源创建
从网络为源创建媒体源与本地文件的媒体源不同。 应用程序将源的 URL 传递给 Source Resolver 方法,例如 IMFSourceResolver::CreateObjectFromURL 或 IMFSourceResolver::BeginCreateObjectFromURL 并指定MF_RESOLUTION_MEDIASOURCE标志。 有关使用此标志的详细信息,请参阅 使用源解析程序。
根据应用程序提供的方案,源解析程序加载相应的方案处理程序对象,该对象公开 IMFSchemeHandler 接口。 应用程序还可以直接使用方案处理程序通过调用 IMFSchemeHandler::BeginCreateObject来创建网络源。
有关详细信息,请参阅 方案处理程序和 Byte-Stream 处理程序。
媒体基础不支持网络源的字节流。 字节流对象仅在下载的内容方案中受支持。 所有数据都尽快传输,以便将其保存为本地计算机上的文件。 Web 服务器提供下载的数据。 下载开始后,客户端不会与服务器通信。 在这种情况下,将使用 HTTP 下载协议。
如果应用程序请求源解析程序为“http:”、“mms:”或“rtsp:”方案创建字节流对象,则调用失败并出现MF_E_UNSUPPORTED_SCHEME错误。
注意
在 Windows 7 中,网络源支持 Windows 媒体工作站文件(。NSC)。 这些文件用于通过网络进行媒体内容的多播流式传输。 为指定的网络源创建网络源。NSC 文件,应用程序必须使用源解析程序。
如果应用程序正在使用方案处理程序,则异步调用将忽略 dwFlags 参数,并在完成时返回指向网络源的指针。
下图显示了使用网络源进行媒体流式传输的数据流。
网络源配置
本主题介绍网络源和关联的配置选项支持的功能。 应用程序可以在创建网络源对象时配置网络源。 这些选项存储在 IPropertyStore 对象中,应用程序必须传入源解析程序方法的 pProps 参数,或 IMFSchemeHandler::BeginCreateObject。
自动重新连接
网络源的自动重新连接功能使客户端能够在与服务器的 TCP 连接失败或客户端无法接收数据包时自动重新连接到媒体服务器。 连接失败时,网络源会尝试使用上一连接中使用的相同配置重新连接到媒体服务器。 重新连接过程是异步的。 当重新连接成功或失败时,网络源会引发 MEReconnectStart 事件;当重新连接成功或失败时,MEReconnectEnd 事件。
如果重新连接尝试次数超过 MFNETSOURCE_AUTORECONNECTLIMIT 属性指定的最大值,则会取消重新连接作。 重新连接尝试数存储在 MFNETSOURCE_AUTORECONNECTPROGRESS 属性中。
即使与媒体服务器的 TCP 连接失败,自动重新连接也能顺利播放媒体内容。 为了获得流畅的播放体验,客户端必须有足够的数据(至少 1 到 2 分钟)在缓存中继续播放,直到重新连接。 可以在 MFNETSOURCE_MAXBUFFERTIMEMS 属性中设置网络源可以缓冲的最大数据量。
快速流式处理
网络源客户端请求服务器以比内容比特率指定的速率更快地流式传输内容开头的某些数据。 如果在服务器上启用了 快速启动,服务器会发送加速比特率流,以便客户端可以比实时更快地缓冲足够的数据量。 这通过最大程度地减少初始缓冲延迟来提高用户体验,这可能导致各种因素,例如客户端计算机或网络速度低以及可用带宽。
若要指定客户端可以请求的快速流数据量,请设置 MFNETSOURCE_ACCELERATEDSTREAMINGDURATION 属性。 如果网络源使用 UDP 作为传输协议,请改为设置 MFNETSOURCE_MAXUDPACCELERATEDSTREAMINGDURATION 属性来指定最大快速流数据量。
还可以通过 快速缓存 功能在客户端上快速流式传输客户端上的快速流式传输内容-实时流式处理内容,并在客户端的本地缓存上缓存数据。 若要使用此类型的快速流式处理,必须在网络源上启用快速缓存,并且服务器必须支持它。 当客户端从服务器请求内容时,网络源首先检查内容是否已在客户端的缓存中。 如果内容位于客户端的本地缓存中且尚未过期,则呈现该内容。 如果内容不在本地缓存中或已过期,则会流式传输和缓存内容,并且网络源从本地缓存播放它。 在后续请求中,对于播放列表,只缓存缺少的条目,然后播放。 如果播放列表条目已位于客户端的本地缓存中,则会从该处播放该条目,并且不会再次缓存。
默认情况下,快速缓存在网络源客户端上启用。 但是,以下因素还确定是否使用了该功能:
- 客户端必须具有额外的带宽,才能比正常速度更快地下载和缓存内容。
- 客户端必须有足够的磁盘空间。 如果在缓存请求的按需内容后客户端的可用磁盘空间小于 100 MB,则不会缓存,而是同时流式传输和呈现。
快速缓存功能由 MFNETSOURCE_CACHEENABLED 属性控制。
缓冲区管理
网络源提供高效的缓冲区管理,用于监视客户端上的缓冲区状态。 默认情况下,网络源在启动时缓冲 5 秒的数据。 可以通过设置 MFNETSOURCE_BUFFERINGTIME 属性来配置此值。 基于此属性值,网络源将计算足以确保媒体内容的平滑和不间断播放的缓冲区大小。 如果此属性设置为 0,则禁用缓冲区管理。 当缓冲区中的内容量较低时,网络源将开始缓冲,并引发 MEBufferingStarted 事件,以指示缓冲已开始。 收到此事件后,管道将停止呈现。 缓冲完成后,网络源将引发 MEBufferingStopped 事件,客户端可以重新开始呈现。
客户端在累积第一个样本的缓冲区大小指示的数据量后开始呈现内容。 如果此值低于计算的缓冲区大小,则播放会立即启动。 此行为与快速启动功能非常相似。
MFNETSOURCE_MAXBUFFERTIMEMS 属性存储可以缓冲的最大数据量。
带宽选择
当客户端连接到媒体服务器(作为连接设置的一部分)时,网络源将执行 静态数据包对 度量,以估计客户端和服务器之间的初始链接带宽。 根据此度量的结果,客户端可以选择适合估计带宽的音频和视频流。 这可确保流式处理媒体内容的流畅播放。
在快速启动阶段,执行 动态数据包对 度量。 在此过程中,客户端接收大量数据,可以是多个数据包或示例。
动态数据包对度量的结果比静态数据包对度量返回的链接带宽估计更准确,因为静态数据包对过程发送了一个固定大小的数据包,这可能无法为高带宽网络生成准确的结果。
应用程序可以使用 MFNETSOURCE_PPBANDWIDTH 属性获取估计带宽。
网络条件可能会动态更改,导致网络源播放时出现故障。 网络源可以根据接收速率和缓冲区状态更改客户端的初始流选择。 例如,在网络拥塞期间,客户端可能会切换到较低的比特率,并在网络流量有所改善且客户端累积了足够数量的缓冲内容时切换回更高的比特率。
相关主题
-
媒体基础 中的 网络