DirectShow开发笔记与问题记录(2017.11.7更新)

来源:互联网 发布:linux卸载软件包 编辑:程序博客网 时间:2024/05/16 18:07

本博文主要记录本人在使用DirectShow框架,进行播放器、流媒体处理开发过程中遇到的问题以及解决的方法。一方面作为笔记,方便日后参考,另一方面也记录一些疑难杂症,供大家查询。


问题:

1.使用Qt进行DirectShow开发时,遇上“无法解析的外部符号”

此部分错误包括“cocreateinstance”及“sysfree”等一些com件常用的操作。

本人此前已include相关的dshow.h和windows.h头文件,也在pro文件里面,添加了lib。此时,右键可以查找到报错的方法对应的头文件及定义。

解决:

网上有人指出,在Qt里面,构建——qmake(包含清理和重构)一次,如果pro文件引入正确,一般可以解决。

但我qmake多次,仍报错,包括清理生成的目录及重启Qt。最后发现是,VS下默认缺省添加的一些lib没有引入。

在我加入以下lib之后,qmake后成功运行。

kernel32.lib \
    user32.lib \
    gdi32.lib \
    winspool.lib \
    comdlg32.lib \
    advapi32.lib \
    shell32.lib \
    ole32.lib \
    oleaut32.lib \
    uuid.lib \
    odbc32.lib \
    odbccp32.lib\
这边再说一下普遍的排除过程:

1.首先确定对应的lib添加进了pro中。(无法解析的外部符号,意指无法根据头文件找到对应的库)

2.尝试qmake及清理重构工程

3.pro中顺序,先INCLUDEPATH,再LIBS

4.检查库的版本,是否与Qt编译版本对应(win32及64)


2.开发DirectShow Filter的时候,遇上dll无法注册,显示“模块加载失败……找不到指定模块”


问题描述:

进行一个转换filter开发的时候,一开始继承“CTransInplaceFilter”进行开发。此时过程中一切正常,而后发现需要更改输出格式,并重新分配Allocate和buffer大小,因此更改了继承,选择使用“CTransformFilter”进行开发。

更换了父类之后,修改了构造函数和createInstance等参数后,未进行调试,直接继续进行开发。

1.调试的时候,发现graphstudionext中选中Filter双击,无法再界面中出现Filter框体。

2.添加了断点,发现没有触发任何的构造、创建实例函数。

3.graphstudionext无法注销filter的注册,regsvr32无法注册也无法注销filter的注册(DLL)。

4.期间代码未做任何删减,仅有必要的函数override。


解决:

通过拷贝项目,进行回滚测试,定位到了两个函数引起了DLL注册错误。

BreakConnect(PIN_DIRECTION dir)

CompleteConnect(PIN_DIRECTION direction, IPin *pReceivePin)

我在这两个函数里面调用了外部的FFMpeg库。

此时,我想起我没有将FFMpeg库对应的dll文件拷贝到工程生成的程序目录中。

因此,这是一个由于Filter(COM件)内包含了外部库调用,依赖库找不到dll文件引起的注册失败问题。

将FFMpeg的DLL文件拷贝到release(生成)的目录中,com件正常注册通过。

阅读全文
1 0
原创粉丝点击