【问题标题】:How data is moving across filters through pins in OBS-Studio virtual camera on windows?数据如何通过 Windows 上的 OBS-Studio 虚拟相机中的引脚跨过滤器移动?
【发布时间】:2021-05-04 15:35:43
【问题描述】:

我喜欢OBS-Studio 的虚拟相机功能。

我试图了解它的工作原理,但无法正确理解。我只知道它是使用DirectShow 构建的。项目包含 OutputFilterOutputPinCaptureFilterCapturePin

class OutputFilter : public IBaseFilter {
    // ...
    friend class OutputPin;
    IFilterGraph *graph;
    ComPtr<OutputPin> pin;
    // ...
}

class OutputPin : public IPin, public IAMStreamConfig, public IKsPropertySet {
    // ...
    friend class OutputFilter;
    // ...
}

class CaptureFilter : public IBaseFilter {
    // ...
    friend class CapturePin;
    ComPtr<IFilterGraph> graph;
    ComPtr<CapturePin> pin;
    // ...
}

class CapturePin : public IPin, public IMemInputPin {
    // ...
    CaptureFilter *filter;
    // ...
}

当我们启用虚拟相机时,数据如何通过这些过滤器和引脚移动?

【问题讨论】:

    标签: c++ com directshow obs-studio virtual-webcam


    【解决方案1】:

    他们使用的是shared memory server。基本上,它们有一个渲染过滤器,可以将传入的位图复制到共享内存中。然后他们有一个捕获过滤器,可以从共享内存中读取位图。你可以在这里看到他们的一些代码:win-dshow

    【讨论】:

    • 感谢您的回答。我的问题中是否提到了OutputFilter 作为您在回答中提到的渲染过滤器?我的问题中提到的CaptureFilter 是否与您的答案中提到的捕获过滤器相同?
    • 使用 DirectShow 基类:您需要一个基于 CBaseRenderer 的渲染过滤器和一个基于 CRendererInputPin 的输入引脚,它将位图复制到共享内存中。然后你需要一个基于 CSource 的捕获过滤器和一个基于 CSourceStream 的输出引脚,用于从共享内存中读取位图。
    • P.S. CSourceStream 管脚必须实现 IKsPropertySet 和 IAMStreamConfig 接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多