directshow源过滤器是否可以从应用程序中读取数据?

时间:2014-06-26 01:18:04

标签: c++ directshow

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

方案: 设备 - >申请 - > (DirectShow源过滤器) - > (DirectShow DecoderFilter) - > (DirectShow Sink)

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

谢谢罗马。

我现在能够通过接口从应用程序将数据传递给源驱动程序。 我从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;
}

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

再次感谢。