我正在尝试使用一个定制的过滤器来接收来自RTSP流的视频和音频数据,并在图的下游传递样本。这个过滤器似乎是从SDK source.cpp示例(CSource)修改而来的,实现了音频和视频的两个输出引脚。当过滤器直接连接到具有INTERLEAVE_NONE模式的avi多路复用过滤器时,它工作得很好。
但是,当avi多路复用器的交错模式设置为INTERLEAVE_CAPTURE时,视频输出引脚将挂在此滤波器的GetDeliveryBuffer方法(在DoBufferProcessingLoop中)上,而音频输出引脚仍然工作正常。
此外,当我在avi多路复用器和这个源滤波器之间的一条路径中插入一个无限针三通滤波器时,在发送了一些样本(一到三个样本或类似的样本)后,图形会任意转换为停止状态。当我把一个过滤器放在一个空的,在无限的T形之后什么也不做的地方,图又回到了第一种情况:永远不会转到停止状态,而是挂在GetDeliveryBuffer上。
(下面的图片显示了我所提到的连接)
所以我的问题是:
1:视频输出引脚挂在GetDeliveryBuffer上的原因可能是什么?
在我看来,avi多路复用器捕获了这些样本缓冲区,直到它们足够用于交错时才释放它们,但即使我在DecideBufferSize中将视频缓冲区的数量设置为30,它仍然会挂起。如果确实是这样的原因,那么我如何决定下游avi多路复用器引脚的缓冲区大小?
很可能不能保证创建超过50个视频管脚的缓冲器工作,因为不能保证存储器大小。:(
2:当插入无限大销T形三通时,为什么图形变为停止状态?为什么一个非操作过滤器可以克服它呢?
任何答案或建议都是值得感谢的。或者希望有人能给我指路。谢谢。
发布于 2013-12-10 05:51:50
阻塞的GetDeliveryBuffer
意味着您正在请求缓冲区的分配器还没有为您提供任何东西。所有媒体样本都是未完成的,尚未返回给分配器。
一个明显的解决办法是在引脚连接和内存分配器协商阶段请求更多的缓冲区。然而,这只是推迟了这个问题,因为同样的原因,这个问题可能会很晚出现。
有问题的拓扑的一个典型问题与线程有关。具有两个输入的多路复用器过滤器必须匹配输入流才能生成联合文件。在运行时,它经常会在一条腿上保存媒体样本,而在另一条线程上期望更多的媒体样本出现在另一条腿的上。假设提供媒体样本的上游分支独立运行,因此一个分支上的锁不会锁定另一个分支。这就是为什么多路复用器可以自由地阻止IMemInputPin::Receive
方法和/old保存媒体样本。在上面的拓扑中,还不清楚源过滤器到底是如何进行线程化的。它有两个引脚的事实让我认为它可能存在线程问题,并且它没有考虑到多路复用器的下游可能有一个锁。
假设源过滤器是你的,你有它的源代码。您有兴趣确保音频引脚在单独的线程上发送媒体样本,例如通过异步队列。
https://stackoverflow.com/questions/20468760
复制相似问题