簡體   English   中英

DirectShow源過濾器是否可以從應用程序讀取數據?

[英]Is it possible to for a directshow source filter to read data from application?

我希望編寫一個DirectShow源過濾器,該過濾器從應用程序讀取數據,而不是從文件/套接字/設備讀取數據。 首先有可能嗎? 如果可以,我該如何實現? 我已經使用appsrc插件在gstreamer中進行了相同的操作,並且由於我是DirectShow的新手,所以可以有人解釋一下。

場景:設備->應用程序->(DirectShow源過濾器)->(DirectShow DecoderFilter)->(DirectShow接收器)

提前致謝。

可以,但是您必須實現源過濾器與其數據源(應用程序)之間的通信。 您的源過濾器和應用程序可以通過套接字,管道或內存映射文件進行通信-任何進程間通信都可以解決問題(如果應用程序托管源過濾器,即在單個進程內,則可以建立直接通信)。 沒有標准組件甚至輔助程序都可以附加到源過濾器,您將需要處理原始API。

謝謝羅馬。

現在,我可以通過接口將數據從應用程序傳遞到源驅動程序。 我從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;
}

我將使用另一種方法將應用程序緩沖區傳遞到源過濾器隊列。

再次感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM