【问题标题】:Is it possible to for a directshow source filter to read data from application?是否可以让 directshow 源过滤器从应用程序中读取数据?
【发布时间】:2014-06-26 01:18:04
【问题描述】:

我希望编写一个从应用程序读取数据而不是从文件/套接字/设备读取数据的 directshow 源过滤器。 首先是可能吗?如果是这样,我该如何实现? 我使用appsrc插件在gstreamer中做了同样的事情,因为我是directshow的新手,有人可以解释一下。

场景: 设备 -> 应用程序 -> (DirectShow Source Filter) -> (DirectShow DecoderFilter) -> (DirectShow Sink)

提前致谢。

【问题讨论】:

    标签: c++ directshow


    【解决方案1】:

    这是可能的,但您必须实现源过滤器与其数据源(应用程序)之间的通信。您的源过滤器和应用程序可以通过套接字或管道或内存映射文件进行通信 - 任何进程间通信都可以解决问题(如果应用程序托管源过滤器,即在单个进程内,您可以建立直接通信)。没有标准组件,甚至没有附加到源过滤器的帮助程序,您需要处理原始 API。

    【讨论】:

    • 我们可以创建一个界面并通过它提供数据。
    【解决方案2】:

    谢谢罗曼。

    我现在可以通过接口将数据从应用程序传递到源驱动程序。 我从 directshow 示例中提取了 pushsource 过滤器,并使用下面的示例为其添加了一个附加接口

    将其包含在一个通用头文件中

    DECLARE_INTERFACE_(IMySettingsInterface, IUnknown)
    {
    
    STDMETHOD(GetParamInt)(char* szName, int *pParam) = 0;
    STDMETHOD(SetParamInt)(char* szName, int nParam) = 0;
    
    };
    
    // {F350FE9E-65BA-4AC1-A6C0-FD9F2979D342}
    
    
    DEFINE_GUID(IID_IMySettings,
    
    0xf350fe9e, 0x65ba, 0x4ac1, 0xa6, 0xc0, 0xfd, 0x9f, 0x29, 0x79, 0xd3, 0x42);
    

    对 CPushSourceDesktop 类所做的更改

    class CPushSourceDesktop : public CSource, public IMySettingsInterface
    
    {
    
    private:
    
    // Constructor is private because you have to use CreateInstance
    
    CPushSourceDesktop(IUnknown *pUnk, HRESULT *phr);
    
    ~CPushSourceDesktop();
    
    CPushPinDesktop *m_pPin;
    
    public:
    
    DECLARE_IUNKNOWN;
    
    static CUnknown * WINAPI CreateInstance(IUnknown *pUnk, HRESULT *phr);  
    
    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
    
    //Methods the interface supports
    
    STDMETHODIMP GetParamInt(char* szName, int *pParam);
    
    STDMETHODIMP SetParamInt(char* szName, int nParam);
    
    };
    

    我使用VS的创建GUID工具生成了UUID。

    在我的过滤器中定义了这些接口方法

    STDMETHODIMP CPushSourceDesktop::NonDelegatingQueryInterface(REFIID riid, void **ppv)
    {
        if (riid == (IID_IMySettings))
        {
            return GetInterface((IMySettingsInterface*) this, ppv);
        }
        else
        {
            return CSource::NonDelegatingQueryInterface(riid, ppv);
        }
    }
    
    
    STDMETHODIMP CPushSourceDesktop::GetParamInt(char* szName, int *pParam)
    
    {
        // Example
    
        *pParam = 10;
    
        return 0;
    }
    
    STDMETHODIMP CPushSourceDesktop::SetParamInt(char* szName, int pParam)
    {
    
        //Example
        return 0;
    }
    

    我将使用另一种方法将应用程序缓冲区传递给源过滤器队列。

    再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多