首页 文章

为什么GetDeliveryBuffer被INTERLEAVE_CAPTURE模式AVI Mux阻止?

提问于
浏览
1

我正在尝试使用自定义过滤器从RTSP流接收视频和音频数据,并在图表下方传送样本 . 看起来这个过滤器是从SDK source.cpp示例(CSource)修改过来的,并为音频和视频实现了两个输出引脚 . 当滤波器直接连接到具有INTERLEAVE_NONE模式的avi mux滤波器时,它可以正常工作 .

但是,当avi mux的交错模式设置为INTERLEAVE_CAPTURE时,视频输出引脚将在发送多个样本后在此过滤器的GetDeliveryBuffer方法(DoBufferProcessingLoop)中挂起,而音频输出引脚仍能正常工作 .

此外,当我将无限针三通滤波器插入avi mux和此源滤波器之间的一条路径时,图形在发送了一些样本(一到三个样本或类型)后任意变为停止状态 . 当我放置一个过滤器,它只是一个空的trans-in-place过滤器,在无限T恤之后什么也不做,图表又回到了第一种情况:永远不会转到停止状态,而是挂在GetDeliveryBuffer上 .

(这是一张显示我提到的连接的图像)
enter image description here

所以这是我的问题:

1:视频输出引脚挂在GetDeliveryBuffer上的原因是什么?

在我的猜测中,看起来avi mux捕获了这些样本缓冲区并且在它们足以进行交错之前没有释放它们,但即使我在DecideBufferSize中将视频缓冲区的数量设置为30,它仍然会挂起 . 如果原因确实如此,那么如何确定下游avi muxer的引脚缓冲区大小?

可能无法保证创建超过50个视频引脚的缓冲区,因为无法承诺内存大小 . :(

2:为什么插入无限针T形时图形会停止状态?为什么无操作过滤器可以克服它?

任何答案或建议表示赞赏 . 或者希望有人给我一些指示 . 谢谢 .

1 回答

  • 1

    被阻止的 GetDeliveryBuffer 表示分配器,您正在请求缓冲区,但尚未为您提供任何内容 . 所有媒体样本都很突出,尚未返回分配器 .

    一个明显的工作是在引脚连接和内存分配器协商阶段请求更多缓冲区 . 然而,这只是推迟了这个问题,出于同样的原因,这个问题可能会在以后同样出现 .

    有问题的拓扑的典型问题与线程有关 . 具有两个输入的多路复用器滤波器必须匹配输入流以产生联合文件 . 经常在运行时它将在一条腿上保持媒体样本,同时期望更多的媒体样本出现在另一条腿上 on another thread . 假设提供媒体样本的上游分支独立运行,使得一条腿上的锁定不会锁定另一条腿 . 这就是为什么多路复用器可以自由地阻止 IMemInputPin::Receive 方法和/旧保持媒体样本 . 在上面的拓扑中,不清楚源过滤器究竟是如何进行线程化的 . 它有两个引脚的事实使我认为它可能有线程问题,并没有考虑到多路复用器下游可能存在锁定 .

    据说源过滤器是你的,你有源代码 . 您有兴趣确保音频引脚在单独的线程上发送媒体样本,例如通过异步队列 .

相关问题