网络源功能

网络源为流式处理媒体文件提供基本实现,并公开 IMFMediaSource 接口。 特定的网络源实现取决于用于打开源的协议,例如 RTSP 或 HTTP。 特定于协议的网络源扩展了基本网络功能。 有关支持的方案和协议的信息,请参阅 支持的协议

网络源:

  • 实现缓存、代理检测和自动重新连接等功能。
  • 将独立于协议的调用从源解析程序转换为特定于协议的调用。
  • 与套接字层和操作系统交互。 分析 SDP 说明并将其用作配置数据,并从基础套接字层读取流数据。 接收时,网络源负责重新排序和请求重新传输数据包。

网络源创建

从网络为源创建媒体源与本地文件的媒体源没有区别。 应用程序将源的 URL 传递给 源解析程序 方法,例如 IMFSourceResolver::CreateObjectFromURLIMFSourceResolver::BeginCreateObjectFromURL ,并指定MF_RESOLUTION_MEDIASOURCE标志。 有关使用此标志的详细信息,请参阅 使用源解析程序

根据应用程序提供的方案,源解析程序加载相应的方案处理程序对象,该对象公开 IMFSchemeHandler 接口。 应用程序还可以通过调用 IMFSchemeHandler::BeginCreateObject 直接使用方案处理程序来创建网络源。

有关详细信息,请参阅 方案处理程序和Byte-Stream处理程序

Media Foundation 不支持网络源的字节流。 仅在下载的内容方案中支持字节流对象。 所有数据都尽快传输,以便可以将其保存为本地计算机上的文件。 Web 服务器提供下载的数据。 下载开始后,客户端与服务器没有通信。 在这种情况下,使用 HTTP 下载协议。

如果应用程序请求源解析程序为“http:”、“mms:”或“rtsp:”方案创建字节流对象,则调用失败并显示MF_E_UNSUPPORTED_SCHEME错误。

注意

在 Windows 7 中,网络源支持 windows Media Station 文件 (。NSC) 。 这些文件用于通过网络多播流式传输媒体内容。 为指定的 创建网络源。NSC 文件,应用程序必须使用源解析程序。

 

如果应用程序使用方案处理程序,则异步调用将忽略 dwFlags 参数,并在完成后返回指向网络源的指针。

下图显示了使用网络源进行媒体流式传输的数据流。

显示从应用程序到流式处理服务器的路径的流程图,以及网络源和媒体会话之间的循环

网络源配置

本主题介绍网络源支持的功能以及关联的配置选项。 应用程序可以在创建网络源对象时配置网络源。 这些选项存储在 IPropertyStore 对象中,应用程序必须传入源解析程序方法或 IMFSchemeHandler::BeginCreateObjectpProps 参数。

自动重新连接

网络源的自动重新连接功能使客户端能够在与服务器的 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 属性获取估计的带宽。

网络条件可能会动态更改,导致网络源播放时出现故障。 网络源可以根据接收速率和缓冲区状态更改客户端的初始流选择。 例如,在网络拥塞期间,客户端可能会切换到较低的比特率,并在网络流量改善且客户端累积了足够数量的缓冲内容时切换回更高的比特率。

Media Foundation 中的网络