我在Windows Media Foundation中拥有自己的MediaSink
,其中包含一个流。在OnClockStart
方法中,我指示流将(i)MEStreamStarted
和(ii)MEStreamSinkRequestSample
排队。为了实现队列,我使用IMFMediaEventQueue
,并使用mtrace
工具,我也可以看到有人将事件排队。
问题是我的流的ProcessSample
实际上从未被调用过。这也会导致无法请求更多样本,因为这是在处理https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/DX11VideoRenderer中的样本后完成的。
所描述的方法是否是实施接收器的正确方法?如果没有,那么正确的方法是什么?如果是这样,我在哪里可以搜索问题?
一些背景信息:接收器是基于live555的RTSP接收器。由于后者也是接收器驱动的,我认为每当live555向我请求更多数据时排队MEStreamSinkRequestSample
是个好主意。 这是按预期工作的。
但是,该解决方案存在的问题是,只要客户端连接到live555,就会请求新样本。如果我现在在接收器之前添加一个T形接头,例如为了显示本地预览,则系统失控,因为tee在我的接收器的输出上累积样本,这些样本从不被提取。然后我开始使用可丢弃的样本(参见https://social.msdn.microsoft.com/Forums/sharepoint/en-US/5065a7cd-3c63-43e8-8f70-be777c89b38e/mixing-rate-sink-and-rateless-sink-on-a-tee-node?forum=mediafoundationdevelopment),但问题是流没有启动,队列正在增长或者更快的接收器的帧速率是人为限制的,具体取决于哪一侧是可丢弃的
因此,下一个想法是重写我的接收器,以便它在处理当前接收器时始终请求新样本并将所有样本放入live555的环形缓冲区中,这样无论何时连接客户端,它们都可以从在那里,否则,样品就被丢弃了。这根本不起作用。现在,即使没有发球台,我的水槽也没有任何东西。
观察结果是:如果我只是请求大量样本(如原始方法),那么在某些时候,我会得到数据。但是,如果我只请求一个(我也尝试过5个中等大小的数字),则不会调用ProcessSample
,因此不会生成后续请求。我会在时钟启动时发送MeStreamStarted
,或者完全按照https://msdn.microsoft.com/en-us/library/windows/desktop/ms701626中所述重新启动,之后,我会请求第一个样本。根据我的理解,MEStreamSinkRequestSample
不应该迷路,所以我应该在一个请求上得到一些东西。这是误会吗?在得到什么之前我应该要求吗?