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