[英]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.