我正在尝试使用 IMFMediaSession 进行简单的视频播放。文档指出它的大多数方法都是异步的,当它们完成时我将通过 IMFAsyncCallback 收到通知。但尚不清楚发出多个异步调用时会发生什么。例如,我调用 IMFMediaSession::SetTopology 后,可以立即调用 IMFMediaSession::Start 还是必须等待 MESessionTopologySet 事件?
再举一个例子,“如何执行清理”中的示例代码在 IMFRateControl::SetRate 之后立即调用 IMFMediaSession::Start,而不等待 MESessionRateChanged 事件,这仅在异步请求严格按 FIFO 顺序完成时才有效。是这样吗?
...发出多个异步调用时会发生什么。例如,我拨打
后,我可以立即拨打IMFMediaSession::SetTopology
吗...IMFMediaSession::Start
您无法启动未解析(=尚未创建)的拓扑,可以吗?
异步的想法是(1)不阻塞调用者的调用(2)将较大的任务分成较小的工作项,根据需要串行和/或并行执行。
在大多数情况下,您应该作为异步处理程序进行调用并捕获完成。实现不会立即执行您的请求:它们会在内部将工作项发布到工作队列上,可能有多个工作项要做,然后最终在完成时您会收到通知。但有时您可以立即连续进行几个调用,因为它们只是在内部排队以顺序执行。在您的速率更改示例中,更改的速率不会阻止拓扑启动/停止。但未解决的拓扑将是一个障碍。