IMFMediaSource::Start 方法 (mfidl.h)

通过指定开始播放的位置来启动、查找或重启媒体源。

语法

HRESULT Start(
  [in] IMFPresentationDescriptor *pPresentationDescriptor,
  [in] const GUID                *pguidTimeFormat,
  [in] const PROPVARIANT         *pvarStartPosition
);

参数

[in] pPresentationDescriptor

指向媒体源的表示描述 符的 IMFPresentationDescriptor 接口的指针。 若要获取演示文稿描述符,请调用 IMFMediaSource::CreatePresentationDescriptor。 可以在调用 Start 之前修改演示文稿描述符,以选择或取消选择流或更改媒体类型。

[in] pguidTimeFormat

指向指定时间格式的 GUID 的指针。 时间格式定义 pvarStartPosition 参数的单位。 如果值为 GUID_NULL,则时间格式为 100 纳秒单位。 某些媒体源可能支持额外的时间格式 GUID。 此参数可以为 NULL。 如果值为 NULL,则等效于 GUID_NULL

[in] pvarStartPosition

指定开始播放的位置。 此参数的单位由 pguidTimeFormat 中给定的时间格式指示。 如果时间格式 为GUID_NULL,则变体类型必须为 VT_I8VT_EMPTY。 使用 VT_I8 以 100 纳秒为单位指定新的起始位置。 使用 VT_EMPTY 从当前位置开始。 其他时间格式可能使用其他 PROPVARIANT 类型。

返回值

该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
方法成功。
MF_E_ASF_OUTOFRANGE
起始位置在 ASF 媒体源) (演示文稿末尾。
MF_E_HW_MFT_FAILED_START_STREAMING
硬件设备无法启动流式处理。 此错误代码可由表示硬件设备的媒体源(如相机)返回。 例如,如果相机已被另一个应用程序使用,该方法可能会返回此错误代码。
MF_E_INVALIDREQUEST
启动请求无效。 例如,开始位置超过演示文稿的结尾。
MF_E_SHUTDOWN
已调用媒体源的 Shutdown 方法。
MF_E_UNSUPPORTED_TIME_FORMAT
媒体源不支持 pguidTimeFormat 中指定的时间格式。

注解

此方法是异步方法。 如果操作成功,媒体源将发送以下事件:

  • 对于每个新流,源将发送 MENewStream 事件。 对于显示流的第一个 Start 调用,将发送此事件。 事件数据是指向流的 IMFMediaStream 接口的指针。
  • 对于每个 更新 的流,源将发送 MEUpdatedStream 事件。 如果调用 Start 时流已存在,则 (更新流,例如,如果应用程序在播放) 期间查找。 事件数据是指向流的 IMFMediaStream 接口的指针。
  • 如果以前的状态已停止,则源会发送 MESourceStarted 事件。
  • 如果以前的状态已启动或暂停,并且起始位置是当前位置 (VT_EMPTY) ,则源将发送 MESourceStarted 事件。
  • 如果以前的状态已启动或暂停,并且指定了新的起始位置,则源将发送 MESourceSeeked 事件。
  • 如果源发送 MESourceStarted 事件,则每个媒体流发送一个 MEStreamStarted 事件。 如果源发送 MESourceSeeked 事件,则每个流发送一个 MEStreamSeeked 事件。
如果在方法返回S_OK) 后异步 (启动操作失败,媒体源将发送包含失败代码的 MESourceStarted 事件,而不发送此处列出的任何其他事件。 如果方法同步失败 (返回错误代码) ,则不会引发任何事件。

如果上一个状态已启动或暂停,并且新的起始位置未VT_EMPTY,则调用 Start 会导致查找。 并非每个媒体源都可以查找。 如果媒体源可以查找, IMFMediaSource::GetCharacteristics 方法将返回 MFMEDIASOURCE_CAN_SEEK 标志。

来自媒体源的事件与媒体流中的事件不同步。 因此,如果查找媒体源,在获取 MESourceSeeked 事件后,仍可以从早期位置接收样本。 如果需要同步操作,请等待流事件 MEStreamSeeked,该事件标记流中发生查找的确切点。

Stream结束

当流播放到末尾时,流会发送 MEEndOfStream 事件。 当所有选定的流到达末尾时,媒体源将发送 MEEndOfPresentation 事件。

如果起始位置超过所选流的末尾 (但在演示) 结束之前,则流应立即在 MEStreamStarted/MEStreamSeeked 之后发送 MEEndOfStream。 如果播放到达演示文稿的末尾,并且从当前位置再次调用 Start ,则流将重新发送 MEEndOfStream 事件,媒体源将重新发送 MEEndOfPresentation 事件。 这些事件通知管道不再请求任何数据。

在反向播放期间,文件的开头被视为流的结尾。 有关详细信息,请参阅 实现速率控制

实现“开始”

当媒体源执行查找时,它应在查找时间之前的第一个关键帧开始,以便解码器可以解码目标开始时间的样本。 管道将放弃任何过早解码的样本。

如果开始时间 VT_EMPTY 并且以前的状态已启动或暂停,则源应从其当前位置恢复。 在这种情况下,无需重新发送上一个关键帧,因为解码器仍将具有以前发送的数据。

验证 pPresentationDescriptor 参数时,媒体源应仅为正常运行所需的信息检查。 具体而言,客户端可以将私有属性添加到演示文稿描述符。 存在其他属性不应导致 Start 方法失败。

调用 Start 后,媒体源上的每个流都必须执行以下操作之一:

有关详细信息,请参阅 编写自定义媒体源

示例

以下示例在 1 秒开始播放演示文稿。

PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.

hr = pSource->Start(pPresentationDescriptor, NULL, &var);

要求

要求
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 mfidl.h
Library Mfuuid.lib

另请参阅

IMFMediaSource

媒体源