Directshow 直播源过滤器设计

Posted

技术标签:

【中文标题】Directshow 直播源过滤器设计【英文标题】:Directshow Live Source Filter Design 【发布时间】:2012-08-16 11:49:07 【问题描述】:

我正在开发 Live DirectShow 过滤器。

我有一个 H264 流源,我可以通过 SDK API 获取流。

在我的过滤器中,我有一个队列,我将来自线程的传入流入队(推送)。 然后我在过滤器 FillBuffer 中消耗(出列,弹出)这些流...

所以我创建了一个线程安全的队列......但这会导致一些问题......

在 FillBuffer,如果我检查是否有任何传入数据包,如果有,则处理 逻辑是这样的:

    ...
    bool hasElement = SynchronizedQueue.pop(element);

    if(!hasElement)
    
        return S_OK
    
    ...

...这会消耗大量 CPU...

如何使用 boost lib 实现带条件变量的锁

...
SynchronizedQueue.waitAndPop(element) ;// which wait until we have some

有情人CPU的...但是有时候Queue中没有数据的时候,这个block的FillBuffer函数和filter可能不会停止...

那么对于从远程机器获取输入流并将其传递给解码器的实时源过滤器的任何设计理念替代方案? 或者我怎样才能让我的设计更好....更低的 CPU 并且可以停止?

【问题讨论】:

【参考方案1】:

源过滤器拥有一个推送线程,因此您需要使用同步对象(事件、互斥锁)在那里等待以产生控制,直到有新帧可用于推送输出引脚。

当您从 SDK 接收到帧并将其放入队列时,您将使用同步对象来指示此可用性,例如你会set an event。工作线程将看到事件并开始处理帧。

工作线程至少需要能够响应两个事件:新帧和过滤器/图形停止。所以你需要WaitForMultipleObjects 来等待多个事件并在第一个事件发生时唤醒。

【讨论】:

嗯,它是在你的对象上调用的IBaseFilter::Stop,除了你和基类已经在做的事情之外,你绝对可以处理它。

以上是关于Directshow 直播源过滤器设计的主要内容,如果未能解决你的问题,请参考以下文章

具有多个视频帧的 DirectShow 变换过滤器 - 与音频同步

将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页

直播到浏览器

在 directshow 过滤器中保存帧

开源YUV420转RGB源码或directshow

更改 lameDS-3.99.5 DirectShow 过滤器的默认比特率