OBS-VirtualCam 與vcam項目

下面是OBS-VirtualCam項目結(jié)構(gòu)與Vivek‘s VCam項目結(jié)構(gòu)的對比踪危,OBS-VirtualCam比vcam項目多出來關(guān)于virtual-audio的相關(guān)代碼裙盾,猜測應(yīng)該是鏈接obs音頻的刊头。視頻部分兩者非常的相似现横。


image.png

為了更清楚的了解兩個項目怀各,我們在比較了各自的頭文件听系,virtual-cam.h與filters.h:
Filter 類對比:


image.png

output in類對比:
image.png

可以看到舍悯,不論是取名航棱、注釋還是繼承,類結(jié)構(gòu)萌衬,兩者是非常一致的饮醇,可以看出來OBS-VirtualCam正式在Vivek‘s VCam項目的基礎(chǔ)上開發(fā)的。
Vivek‘s VCam項目作為一個示例項目主要是根據(jù)xx產(chǎn)生vedio數(shù)據(jù)秕豫,模擬攝像頭朴艰。OBS-VirtualCam同樣是模擬攝像頭观蓄,但是數(shù)據(jù)來源與obs的流,已經(jīng)是一個實用的產(chǎn)品祠墅。參照這兩個項目侮穿,應(yīng)該可以寫出我們想要的虛擬攝像頭項目了。

CVCam類
CVCam類繼承于CSource毁嗦, CSource由directshow 基礎(chǔ)類庫提供亲茅,用來實現(xiàn)基于Push模式的fitler(文檔中指的是source fitler, 這里開發(fā)的是capture filter, 看來這兩個在filter開發(fā)上是通用的)。


image.png
class CVCam : public CSource
{
public:
    DECLARE_IUNKNOWN;
    //////////////////////////////////////////////////////////////////////////
    //  IUnknown
    //////////////////////////////////////////////////////////////////////////
    
    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
    IFilterGraph *GetGraph() { return m_pGraph; }
    FILTER_STATE GetState(){ return m_State; }
    CVCam(LPUNKNOWN lpunk, HRESULT *phr, const GUID id, int mode);
protected:
    CVCamStream *stream = nullptr;

};

directorshow fitler 需要滿足COM規(guī)范的要求狗准,根據(jù)注釋DECLARE_IUNKNOWN;應(yīng)該自動添加了IUnkown需要實現(xiàn)的三個接口克锣。
NonDelegatingQueryInterface來自于CUnknown, 根據(jù)CUnknown的描述,它主要用來幫助創(chuàng)建com對象,filter需要繼承自它或子類,并且在public區(qū)域調(diào)用DECLARE_IUNKNOWN; micro缸榄。
NonDelegatingQueryInterface用來overwirte QueryInterface的行為,從而不在調(diào)用baseObject的默認QueryInterface實現(xiàn)巾乳。
m_pGraph在cbasefilter中用于指向filter graph manager,也有對應(yīng)的GetFilterGraph方法故俐,這里重新聲明的方法被用于pin的使用中(CVCamStream的實現(xiàn)中可以看到)想鹰,這里感覺是重復(fù)的方法。
m_State也是在cbase中定義的药版,也有同名方法:

HRESULT GetState(
   DWORD        dwMilliSecsTimeout,
   FILTER_STATE *State
);

可以看到辑舷,這里是做了重載,直接返回了狀態(tài)槽片。
CVCam中聲明了一個output pin, 名字為stream何缓,類型為CVCamStream,對應(yīng)生命的第二個類还栓。

CVCamStream *stream = nullptr;

CVCamStream類
兩個項目的 都一樣繼承自CSourceStream, 同時實現(xiàn)了 IAMStreamConfig, IKsPropertySet:
CSourceStream是所有pin的基礎(chǔ)類碌廓,提供了pin所需要的基礎(chǔ)實現(xiàn)和預(yù)留了的處理函數(shù),以下的方法皆來自于對基礎(chǔ)實現(xiàn)的overwrite.

HRESULT FillBuffer(IMediaSample *pms);
    HRESULT DecideBufferSize(IMemAllocator *pIMemAlloc, ALLOCATOR_PROPERTIES *pProperties);
    HRESULT CheckMediaType(const CMediaType *pMediaType);
    HRESULT GetMediaType(int iPosition,CMediaType *pmt);
    HRESULT SetMediaType(const CMediaType *pmt);
    HRESULT OnThreadCreate(void);
    HRESULT OnThreadDestroy(void);

一個Capurefilter 可以支持多種輸出格式剩盒,不同的格式下又支持多種frame sizes. IAMStreamConfig 用來報告CapD支持那種格式以及設(shè)置格式谷婆。IAMStreamConfig接口描述的正式這些功能。

   HRESULT CreateClassEnumerator(
  [in]  REFCLSID     clsidDeviceClass,      // 確定Filter Categories辽聊,
  [out] IEnumMoniker **ppEnumMoniker,
  [in]  DWORD        dwFlags      //獲取滿足flag條件的fitler
);

IKsPropertySet 用來設(shè)置或獲取設(shè)備屬性纪挎,每一個output pin 需要實現(xiàn)這個接口:

HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwID, 
        void *pInstanceData, DWORD cbInstanceData, void *pPropData, DWORD cbPropData);

    HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, 
        void *pInstanceData, DWORD cbInstanceData, void *pPropData, 
        DWORD cbPropData, DWORD *pcbReturned);

    HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, 
        DWORD dwPropID, DWORD *pTypeSupport);

OBS vcam項目的功能實現(xiàn)要比Vivek‘s VCam項目復(fù)雜,它還定義了很多私有函數(shù)跟匆。
最后异袄,兩個實現(xiàn)的CVCamStream類還都定義了對vcam類的指針。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玛臂,一起剝皮案震驚了整個濱河市烤蜕,隨后出現(xiàn)的幾起案子封孙,更是在濱河造成了極大的恐慌,老刑警劉巖讽营,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虎忌,死亡現(xiàn)場離奇詭異,居然都是意外死亡斑匪,警方通過查閱死者的電腦和手機呐籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門锋勺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀瘸,“玉大人,你說我怎么就攤上這事庶橱≈” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵苏章,是天一觀的道長寂嘉。 經(jīng)常有香客問我,道長枫绅,這世上最難降的妖魔是什么泉孩? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮并淋,結(jié)果婚禮上寓搬,老公的妹妹穿的比我還像新娘。我一直安慰自己县耽,他們只是感情好句喷,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔毙,像睡著了一般唾琼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澎剥,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天锡溯,我揣著相機與錄音,去河邊找鬼哑姚。 笑死祭饭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜻懦。 我是一名探鬼主播甜癞,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宛乃!你這毒婦竟也來了悠咱?” 一聲冷哼從身側(cè)響起蒸辆,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎析既,沒想到半個月后躬贡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡眼坏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年拂玻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宰译。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡檐蚜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沿侈,到底是詐尸還是另有隱情闯第,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布缀拭,位于F島的核電站咳短,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛛淋。R本人自食惡果不足惜咙好,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐荷。 院中可真熱鬧勾效,春花似錦、人聲如沸诚卸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽合溺。三九已至卒密,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棠赛,已是汗流浹背哮奇。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留睛约,地道東北人鼎俘。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像辩涝,于是被迫代替她去往敵國和親贸伐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容