DirectShow--filter 开发 之 编译调试

1用VC写DLL中"error LNK2005: _DllMain@12 already defined"的应对

Visual C++编写DLL,如果在new project时选了MFC DLL,而后又想写成Regular DLL,即拥有自己的DllMain()入口函数,则在build时会遇到类似如下的link错误:

 error LNK2005: _DllMain@12 already defined in xxx.OBJ

1, 你只需要在工程设置里面[project   setting——C/C++——Preprocessor  ],把

WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL

中的_USRDLL,删除,就可以正确编译了

2

C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误之一:

LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in msvcrtd.lib(MSVCRTD.dll)

解决方法:

因为MSVCRT.lib(MSVCRT.dll)是Dll不能Ignore它,应该Ignore的是libcmtd.lib  在Project->settings->Link中Category中选择“input"选项在Ignore

 libraries 中将与MSVCRT.lib冲突的libcmtd.lib写入就行了

3

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc

nafxcwd.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype

解决方法:PROJECT->SETING->C/C++->PREPROCESSOR-> PREPROCESSOR definetions 中加入:_AFXDLL。

4     DEFINE_GUID  引起的错误

在filter开发中用到的 GUID如下:

DEFINE_GUID(CLSID_MPEG4_RECV,

                     0xfea98a1b, 0x6c08, 0x4acc, 0x9d, 0xa, 0xf2, 0xab, 0x52, 0xd8, 0x43, 0x7e);

 

DEFINE_GUID(XVID, 0x44495658, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);//XDIV    xvid mpeg-4 codec

如是没有在任何地方添加Initguid.h,你会得到一个链接错误:"unresolved external symbol." 如图:

  

 

 

如果同样的GUID包含Initguid.h两次,会得到编译错误"redefinition; multiple initialization."如图:

 

 

要解决这些问题,请确认Initguid.h只包含一次。注意:不要包含Initguid.h到预编译头文件中去,因为预编译头文件会被每个源文件包含。

DEFINE_GUID宏定义所需的GUID,全都放在比如myguid.h文件里;同时注意不要Initguid.h到myguid.h头文件中去。

解决方法:比如 我在CRecvOutPutPin :public CbaseOutputPin;

CMpeg4Filter:public CbaseFilter;

全局变量定义处如图:

DirectShow--filter 开发 之 编译调试_第1张图片

 

这三处用到了 myguid.h头文件

那么只在Globals 处 #include 《initguid.h》

其他地方 不再包含此头文件 .

 5  error C2259: 'CMpeg4Filter' : cannot instantiate abstract class due to following members:

 由于CMpeg4Filter 继承自CBaseFilter 而CBaseFilter 中还有纯虚函数 如果在子类不把基类中所有 纯虚函数每个都重写否则CMpeg4Filter 就是抽象类 不能实例化。

所以 在基类基础上进行filter首先要 弄清基类中有哪些 纯虚函数。

6

 

 

C++ Debug:fatal error C1083: Cannot open include file: 'streams.h': No such file or directo
 

错误提示信息:fatal error C1083: Cannot open include file: 'streams.h': No such file or directory

错误原因:找不到streams.h这个文件

解决方法:

1) 安装directX sdk
2)打开安装目录下的dshow.dsw,进行编译
3)在VC++的Tools/Option/Directory的Include和Library中分别加入
C:/DXSDK/Include
C:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES
C:/DXSDK/SAMPLES/C++/COMMON/INCLUDE

C:/DXSDK/Lib
C:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/DEBUG
4)在编译你工程前,在Project/Setting/Link/ 中加入 strmbasd.lib uuid.lib winmm.lib

7

我爱Divx 这个开源的

在写这个MPEG4流的网络接收filter 时

在最开始 我用Xvid 解码器 解码接收到的 MPEG4标准流 然后在VMR9播放时 结果播放时全是乱码如图

 

 

 

在排除了 丢包和 关键帧丢失(在filter 开发中造成 花屏的两个最可能原因 对于MPEG4流 关键帧就是就是 I帧)后 我想到 在网络的发送端 因为我的视频源是一个 .m4e文件 (里面是标准的MPEG4编码流)后来我想到是解码器的原因:.M4E封装的格式和解码器解码不匹配造成的 在考虑到这些后 我 下载了 DivXInstaller 安装后 我在GraphEdt里调试时 在VMR9清晰流畅的播放。看来 Divx 通用性 强于 Xvid 吗 ? 呵呵

8 在build dshow程序的时候出现error LNK2001: unresolved external symbol __imp__timeGetTime@0

出现这个仅仅是因为winmm,这个lib没加上去

你可能感兴趣的:(filter,Microsoft,mfc,dll,include,preprocessor)