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_I8 或 VT_EMPTY。 使用 VT_I8 以 100 纳秒为单位指定新的起始位置。 使用 VT_EMPTY 从当前位置开始。 其他时间格式可能使用其他 PROPVARIANT 类型。
返回值
该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。
返回代码 | 说明 |
---|---|
|
方法成功。 |
|
起始位置在 ASF 媒体源) (演示文稿末尾。 |
|
硬件设备无法启动流式处理。 此错误代码可由表示硬件设备的媒体源(如相机)返回。 例如,如果相机已被另一个应用程序使用,该方法可能会返回此错误代码。 |
|
启动请求无效。 例如,开始位置超过演示文稿的结尾。 |
|
已调用媒体源的 Shutdown 方法。 |
|
媒体源不支持 pguidTimeFormat 中指定的时间格式。 |
注解
此方法是异步方法。 如果操作成功,媒体源将发送以下事件:
- 对于每个新流,源将发送 MENewStream 事件。 对于显示流的第一个 Start 调用,将发送此事件。 事件数据是指向流的 IMFMediaStream 接口的指针。
- 对于每个 更新 的流,源将发送 MEUpdatedStream 事件。 如果调用 Start 时流已存在,则 (更新流,例如,如果应用程序在播放) 期间查找。 事件数据是指向流的 IMFMediaStream 接口的指针。
- 如果以前的状态已停止,则源会发送 MESourceStarted 事件。
- 如果以前的状态已启动或暂停,并且起始位置是当前位置 (VT_EMPTY) ,则源将发送 MESourceStarted 事件。
- 如果以前的状态已启动或暂停,并且指定了新的起始位置,则源将发送 MESourceSeeked 事件。
- 如果源发送 MESourceStarted 事件,则每个媒体流发送一个 MEStreamStarted 事件。 如果源发送 MESourceSeeked 事件,则每个流发送一个 MEStreamSeeked 事件。
如果上一个状态已启动或暂停,并且新的起始位置未VT_EMPTY,则调用 Start 会导致查找。 并非每个媒体源都可以查找。 如果媒体源可以查找, IMFMediaSource::GetCharacteristics 方法将返回 MFMEDIASOURCE_CAN_SEEK 标志。
来自媒体源的事件与媒体流中的事件不同步。 因此,如果查找媒体源,在获取 MESourceSeeked 事件后,仍可以从早期位置接收样本。 如果需要同步操作,请等待流事件 MEStreamSeeked,该事件标记流中发生查找的确切点。
Stream结束
当流播放到末尾时,流会发送 MEEndOfStream 事件。 当所有选定的流到达末尾时,媒体源将发送 MEEndOfPresentation 事件。如果起始位置超过所选流的末尾 (但在演示) 结束之前,则流应立即在 MEStreamStarted/MEStreamSeeked 之后发送 MEEndOfStream。 如果播放到达演示文稿的末尾,并且从当前位置再次调用 Start ,则流将重新发送 MEEndOfStream 事件,媒体源将重新发送 MEEndOfPresentation 事件。 这些事件通知管道不再请求任何数据。
在反向播放期间,文件的开头被视为流的结尾。 有关详细信息,请参阅 实现速率控制。
实现“开始”
当媒体源执行查找时,它应在查找时间之前的第一个关键帧开始,以便解码器可以解码目标开始时间的样本。 管道将放弃任何过早解码的样本。如果开始时间 VT_EMPTY 并且以前的状态已启动或暂停,则源应从其当前位置恢复。 在这种情况下,无需重新发送上一个关键帧,因为解码器仍将具有以前发送的数据。
验证 pPresentationDescriptor 参数时,媒体源应仅为正常运行所需的信息检查。 具体而言,客户端可以将私有属性添加到演示文稿描述符。 存在其他属性不应导致 Start 方法失败。
调用 Start 后,媒体源上的每个流都必须执行以下操作之一:
- 传送媒体数据以响应 IMFMediaStream::RequestSample 调用。
- 发送 MEStreamTick 事件以指示流中的间隙。
- 发送 MEEndOfStream 事件以指示流的结束。
示例
以下示例在 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 |