从网络源播放文件

[与此页面关联的功能 Windows Media Format 11 SDK 是旧版功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用源读取器和接收器编写器,而不是 Windows Media Format 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

从网络读取与读取本地文件没有根本区别。 应用程序将 URL 传递给读取器对象的 IWMReader::Open 方法,读取器对象处理网络协议的详细信息。 读取器对象使用智能缓冲区管理来提供尽可能流畅的播放。 如果应用程序需要对读取器对象的网络设置进行更多控制,可通过 IWMReaderNetworkConfigIWMReaderNetworkConfig2 接口使用这些设置。

来自网络源的内容分为以下两个类别之一:

  • 流。 数据会及时传输,以便在本地计算机上播放。 运行Windows Media 服务的服务器可以提供流数据。 如果多比特率 (MBR) 内容流式传输,则客户端可以在流式处理过程中从服务器请求不同的比特率。
  • 下载。 所有数据都尽快传输,以便可以将其保存为本地计算机上的文件。 Web 服务器提供下载的数据。 下载开始后,客户端与服务器没有通信。

当读取器对象从 Web 服务器下载文件时,它使用一种称为渐进式流式处理的技术,它允许玩家在下载完成之前开始呈现内容。 对数据进行缓冲,以便向玩家提供不间断的数据流。 内容传输速率和持续时间等信息用于确定数据在向玩家提供数据前的缓冲时间。

若要通过网络打开文件或流,请使用相应的 URL 调用读取器的 IWMReader::Open 方法。 Open 是异步调用,因此会立即返回。 当源准备好读取时,读取器对象会将WMT_OPENED通知发送到应用程序的 IWMStatusCallback::OnStatus 回调方法。 此时,应用程序可以通过调用 IWMReaderAdvanced2::GetPlayMode 来查询读取器以查找传递模式。 对于网络内容,此方法将返回指示已下载内容的WMT_PLAY_MODE_DOWNLOAD,或WMT_PLAY_MODE_STREAMING,指示流式传输的内容。

若要开始读取文件或流,请调用 IWMReader::Start 方法。 读取器在开始缓冲内容时发送WMT_BUFFERING_START通知,并在缓冲完成后发送WMT_BUFFERING_STOP通知。 当读取器缓冲内容 (也就是说,在这两个通知) 之间,你可能希望向用户显示缓冲进度。 IWMReaderAdvanced2::GetBufferProgress 方法返回已缓冲的数据百分比和估计剩余时间。 对于下载的内容,还可以调用 IWMReaderAdvanced2::GetDownloadProgress 来获取下载进度。 重复调用这些方法以更新显示,直到缓冲完成。 由于网络拥塞等因素,播放期间可能会再次发生缓冲。 如果发生这种情况,应用程序将收到另一个WMT_BUFFERING_START通知。

当读取器对象开始播放内容时,它会发送WMT_STARTED通知。 当每个示例已解码并可供呈现时,读取器将通过 IWMReaderCallback::OnSample 回调方法将其传递给应用程序。 此时,此过程与本地文件播放的过程相同。 播放停止时,读取器会发送WMT_END_OF_STREAMING通知。

读取 ASF 文件