![](/img/trans.png)
[英]Debug Assertion Failed - DirectShow Filter calling OpenCV Function - Release mode only
[英]Directshow render filter crashes only in release mode
我編寫了一個自定義渲染器過濾器,將視頻幀推送到系統內存,然后推送到OpenGL。 它不在DLL中,我也沒有注冊它,而是像本頁面在第一段中描述的那樣使用它。 在“調試”模式下,此方法工作正常,但在“發行版”中,它開始崩潰。 我正在執行以下初始化圖:
HRESULT hr;
CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);
graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);
grabber = new textureGrabber(0, &hr);
grabber->AddRef(); // crash here
grabber->setTexture(&texture);
grabber->QueryInterface(IID_IBaseFilter, (void**)&base);
graph->AddFilter(base, L"OpenGL texture video filter");
graph->RenderFile(path.c_str(), 0);
由於訪問沖突,這在AddRef()上崩潰。 我已經嘗試過自己實現該類的IUnknown,而我得到的最好的結果就是AddFilter崩潰了,因為IBaseFilter似乎無效。 之后,我什至發現了一個由Microsoft發行的示例 ,該示例都以簡單的方式執行此操作,並且似乎適用於他們。 我很好奇可能做錯了什么,因為我正在做同樣的事情-甚至嘗試了智能指針。
編輯:問題是在CBaseFilter DECLARE_IUNKNOWN宏中,GetOwner()-> AddRef失敗。 GetOwner本身似乎起作用。
GetOwner將您傳遞的任何內容作為第二個參數返回給CBaseFilter構造函數。 通常為NULL,除非您出於某種原因聚集對象(如果確實如此,則可能不需要)。
如果發布版本與Strmbasd.lib
鏈接,則崩潰可能會發生, Strmbasd.lib
是DirectShow基類庫的調試版本。
更改項目的發行版本配置,改為鏈接到Strmbase.lib
,這是該庫的發行版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.