38 个解决方案
#1
把graph build对象也释放试试
#2
应该是没有完全release.
可以这样做,先只是addfilter然后removefilter->release试试。逐步排除原因。
可以这样做,先只是addfilter然后removefilter->release试试。逐步排除原因。
#3
应该是没有完全释放,释放的时候要注意释放的顺序。最后也要释放Filter Graph
#4
graphbuilder也释放了,依然!
大家都没遇到过吗?
大家都没遇到过吗?
#5
就是ffdshow.ax一直在进程中,libavcodec.dll有正常加载和释放!
#6
你的ffdshow是自动加载的吧,你用loadlibarey()手动装载,结束后用freelibarey()释放看看
#7
的确是自动加载的,我用loadlibrary方式加载后创建类厂成功了,但创建DECODER总失败,不知道是不是需要什么特殊设置,如果手工LOADLIBRARY的话手工FREELIBRARY也会有个问题,同一进程下要做引用计数。
我不明白难道DSHOW自动render后的FILTER就不会释放了?是微软的特性吗?
我不明白难道DSHOW自动render后的FILTER就不会释放了?是微软的特性吗?
#8
我通过手工LOADLIBRARY之后创建成功了AUDIO DECODER和VIDEO DECODER但在连接VIDEODECODER和上游的SPLITTER时IGraphBuilder调用Connect连接两个PIN报错,内容如下:
HRESULT: 0x80040217 (2147746327)
Name: VFW_E_CANNOT_CONNECT
Description: No combination of intermediate filters could be found to make the connection.
Severity code: Failed
Facility Code: FACILITY_ITF (4)
Error Code: 0x0217 (535)
报错时SOURCEFILTER和SPLITTER已经建立了连接,应该不存在取不到数据无法判断媒体类型的情况,FFDSHOW还需要如何设置呢?
HRESULT: 0x80040217 (2147746327)
Name: VFW_E_CANNOT_CONNECT
Description: No combination of intermediate filters could be found to make the connection.
Severity code: Failed
Facility Code: FACILITY_ITF (4)
Error Code: 0x0217 (535)
报错时SOURCEFILTER和SPLITTER已经建立了连接,应该不存在取不到数据无法判断媒体类型的情况,FFDSHOW还需要如何设置呢?
#9
可能和ffdshow注册表里的路径有关,你看看[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\ffdshow]下的库路径,和你装载的路径要一致
#10
遍历
释放
释放
#11
智能联接后,你可以把graph加到rot中去,然后通过ge观查一下,把每个filter记下来,手动连接,也可以手动的release,我想就不会存在你说的问题 了。
#12
楼上所述方式均已尝试过,依然无法释放ffdshow.ax模块,甚至手工创建链路CONNECT PIN来解码REAL格式的媒体时也会有ffdshow.ax模块混进来,一旦混进来就不再出去了!
#13
从你的描述来看肯定有你自己的filter混 进来,你应该从你的filter中找原因。
你最好保证你的filter在ffdshow的filter之前退出。
graph成功退出的条件是每个filter内部处于stop状态。
我的建议是你在stop的时候,你的filter停止活动,清理你的现厂,然后打印调试信息,比如在你的析构中trace,表示你的filter退出。然后观查是否ffdshow还在里面。
如果你的filter在他后退出,就表明是你的问题。
你最好保证你的filter在ffdshow的filter之前退出。
graph成功退出的条件是每个filter内部处于stop状态。
我的建议是你在stop的时候,你的filter停止活动,清理你的现厂,然后打印调试信息,比如在你的析构中trace,表示你的filter退出。然后观查是否ffdshow还在里面。
如果你的filter在他后退出,就表明是你的问题。
#14
我编程试了一下,如果全手动创建graph,手动装载ffdshow.ax,手动连接,关闭后可以卸载ffdshow,没有LZ讲的问题
#15
手动load ffdshow.ax,然后用类工厂创建filter 加到gra中,播放后再停止,再释放所有filter,free ffdshow.ax ,就是会出现ffdshow.ax
还在程序中。我一直就出现。
但是可以肯定的是filter这一层级是释放掉了。因为右下角那个托盘图标不在了。
还在程序中。我一直就出现。
但是可以肯定的是filter这一层级是释放掉了。因为右下角那个托盘图标不在了。
#16
to cici2006,ffdshow.ax就是无法被释放掉吗?
我弄了个简单的例子程序发布在http://www.viewany.com/SimplePlayer2.rar 请Jartru 和wwwllg 帮俺瞧瞧
这个例子里没有用之前说过的loadlibrary方式加载ffdshow.ax,用的是标准的创建COM对象的方式,并手工实现pin的连接。
详见bool CDXGraph::RenderFile(const char * inFile)函数。
释放的时候在void CDXGraph::Release(void)函数里, DSHLP_RemoveAllFilters(mGraph);会遍历fillter逐一清理掉,release函数在析构时会调用。
这个例子支持mp3和flv的回放,测试时可以先播放一个flv文件,再播放一个mp3文件,播放mp3文件前会析构掉CDXGraph对象。
播放mp3前可以用pe查一下ffdshow.ax有加载,播放mp3时依然无法卸载!
怎么办?怎么办?怎么办?怎么办?怎么办?
我弄了个简单的例子程序发布在http://www.viewany.com/SimplePlayer2.rar 请Jartru 和wwwllg 帮俺瞧瞧
这个例子里没有用之前说过的loadlibrary方式加载ffdshow.ax,用的是标准的创建COM对象的方式,并手工实现pin的连接。
详见bool CDXGraph::RenderFile(const char * inFile)函数。
释放的时候在void CDXGraph::Release(void)函数里, DSHLP_RemoveAllFilters(mGraph);会遍历fillter逐一清理掉,release函数在析构时会调用。
这个例子支持mp3和flv的回放,测试时可以先播放一个flv文件,再播放一个mp3文件,播放mp3文件前会析构掉CDXGraph对象。
播放mp3前可以用pe查一下ffdshow.ax有加载,播放mp3时依然无法卸载!
怎么办?怎么办?怎么办?怎么办?怎么办?
#17
好办,好办,好办,把分加多点就好办。呵呵。
我晚上回去帮你看一下。
我晚上回去帮你看一下。
#18
每帖只能加分一次,此帖已加过分,不能再加了
加分不是问题,开了个新帖
http://topic.csdn.net/u/20081028/09/2bb30218-9169-49dd-b117-1c93f25003e6.html
明天给新帖再加100
加分不是问题,开了个新帖
http://topic.csdn.net/u/20081028/09/2bb30218-9169-49dd-b117-1c93f25003e6.html
明天给新帖再加100
#19
粗略看了一下代码,感觉是有的filter对象没有release导致整个graph不能释放,
代码里智能指针,对象指针复制怪多的,是不是这方面的问题
代码里智能指针,对象指针复制怪多的,是不是这方面的问题
#20
To: Jartru 请问是哪个filter没释放呢?
#21
我试过你的代码,好象联接不能成功,在 hr = mGraph->Connect(pPinOut,pPinIn);里不能成功。
我自己改成rendfile没有问题。
或者手动联接都没有问题。
我自己改成rendfile没有问题。
或者手动联接都没有问题。
#22
要安装FFDSHOW,FLVSPLITTER,暴风,KMP里都找得到注册一下就可以
#23
我有装暴风,你的source和解码器什么的都创建成功。就是联接不成功。
#24
暴风影音1才行,暴风II是没有注册FILTER的,另外FFDSHOW还要打开对FLV的解码,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\GNU\ffdshow\flv1设置为1 或者在GraphEdit里右键FFDSHOW DECODER的属性也能设置。
#25
如果是为了播放mp3有必要这么复杂么?
一般的大众格式,应该不局限某种编码,你应该比较通用。
如果用户那里没有安装相应解器是客户的事情。
你也可以把你必须要的filter随产品一起发布。
一般的大众格式,应该不局限某种编码,你应该比较通用。
如果用户那里没有安装相应解器是客户的事情。
你也可以把你必须要的filter随产品一起发布。
#26
不仅仅回放MP3,很多媒体类型都要支持。
且如果让用户播放一个2M的小视频给用户安装一个20M的解码器包会非常影响用户体验,我要动态更新解码器,发现当前解码器解码失败时就下载我准备好的,由于FFDSHOW的无法释放造成必须重新启动程序才能重新加载FFDSHOW,问题是这不正常,我想微软也不是这样设计的!
且如果让用户播放一个2M的小视频给用户安装一个20M的解码器包会非常影响用户体验,我要动态更新解码器,发现当前解码器解码失败时就下载我准备好的,由于FFDSHOW的无法释放造成必须重新启动程序才能重新加载FFDSHOW,问题是这不正常,我想微软也不是这样设计的!
#27
这种情况我也遇到过 可能是pin没释放或者什么的
#28
那你就应该只接renderfile,由用户系统内解码器来决定。一般喜欢看电影的用户都有相关的解码器。
#29
直接renderfile也不是不可以,但是ffdshow依然不会被free,用PE查看一直在进程中加载!
#30
这个帖不能就这么沉了!!
#31
用DShow SDK里的sample来播放同一个文件,看看是否有同样的问题?
#32
Jartru 一句话惊醒梦中人,竟然之前没有跟DX SDK的例子比较,比较后的结果更让我吐血,大家上眼吧:
例子1
D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer
点击close菜单后ffdshow.ax被正常卸载,惊喜!以为有救了!可但是...
例子2
D:\dxsdk\Samples\C++\DirectShow\VMR\Renderless
点击close菜单后ffdshow.ax无法卸载,晕倒
那么如此那就找茬吧,最后发现例子1竟然在close时调用了
CoUninitialize()和CoFreeUnusedLibraries()而例子2的调用是随当前实例的生命周期的生死所以没能卸载掉ffdshow.ax
现在来改我的那个程序,原来的CoInitialize是在app的InitInstance中调用,CoUninitialize在ExitInstance中调用,那么挪到CDXGraph类的构造函数和析构函数里,so easy,ffdshow.ax可以正常释放了。
但是靠这种方法我在主线程中播放结束后难道还要*CoUninitialize?其他COM调用可就遭殃了,或许CoUninitialize不是卸载ffdshow.ax的唯一办法
例子1
D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer
点击close菜单后ffdshow.ax被正常卸载,惊喜!以为有救了!可但是...
例子2
D:\dxsdk\Samples\C++\DirectShow\VMR\Renderless
点击close菜单后ffdshow.ax无法卸载,晕倒
那么如此那就找茬吧,最后发现例子1竟然在close时调用了
CoUninitialize()和CoFreeUnusedLibraries()而例子2的调用是随当前实例的生命周期的生死所以没能卸载掉ffdshow.ax
现在来改我的那个程序,原来的CoInitialize是在app的InitInstance中调用,CoUninitialize在ExitInstance中调用,那么挪到CDXGraph类的构造函数和析构函数里,so easy,ffdshow.ax可以正常释放了。
但是靠这种方法我在主线程中播放结束后难道还要*CoUninitialize?其他COM调用可就遭殃了,或许CoUninitialize不是卸载ffdshow.ax的唯一办法
#33
vmrplayer里面CloseMovie里对那些接口的释放,返回值好像都不是0。
我现在也碰到这种问题,在程序中起了若干个线程做同样的事,在线程中coinitialize()、创建graph,加载过滤器,然后退出前释放掉graph,CoUninitialize。其中一个过滤器是自己写的,第一个线程退出时,过滤器的析构函数未被调用,但以后每次释放都会调用析构函数,不知道是为什么。
而且释放过滤器时EnumFilters只能枚举到render。
我现在也碰到这种问题,在程序中起了若干个线程做同样的事,在线程中coinitialize()、创建graph,加载过滤器,然后退出前释放掉graph,CoUninitialize。其中一个过滤器是自己写的,第一个线程退出时,过滤器的析构函数未被调用,但以后每次释放都会调用析构函数,不知道是为什么。
而且释放过滤器时EnumFilters只能枚举到render。
#34
调用CoUninitialize()后会清理强制COM对象,这样看来确实是你程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放。
如果在 例子1D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer ,中close()里不调用CoUninitialize()是否ffdshow.ax也能释放呢?是不是CoFreeUnusedLibraries()起了作用?
如果在 例子1D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer ,中close()里不调用CoUninitialize()是否ffdshow.ax也能释放呢?是不是CoFreeUnusedLibraries()起了作用?
#35
jartru:
看来确实不是我程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放!
屏蔽了vmrplayer例子中的 QzUninitialize();调用后ffdshow.ax也无法释放了。
再次陷入困境......
看来确实不是我程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放!
屏蔽了vmrplayer例子中的 QzUninitialize();调用后ffdshow.ax也无法释放了。
再次陷入困境......
#36
无满意回复结贴,辛苦分送给大家!
#37
d
#38
把所有的PINS断开就行了。
#1
把graph build对象也释放试试
#2
应该是没有完全release.
可以这样做,先只是addfilter然后removefilter->release试试。逐步排除原因。
可以这样做,先只是addfilter然后removefilter->release试试。逐步排除原因。
#3
应该是没有完全释放,释放的时候要注意释放的顺序。最后也要释放Filter Graph
#4
graphbuilder也释放了,依然!
大家都没遇到过吗?
大家都没遇到过吗?
#5
就是ffdshow.ax一直在进程中,libavcodec.dll有正常加载和释放!
#6
你的ffdshow是自动加载的吧,你用loadlibarey()手动装载,结束后用freelibarey()释放看看
#7
的确是自动加载的,我用loadlibrary方式加载后创建类厂成功了,但创建DECODER总失败,不知道是不是需要什么特殊设置,如果手工LOADLIBRARY的话手工FREELIBRARY也会有个问题,同一进程下要做引用计数。
我不明白难道DSHOW自动render后的FILTER就不会释放了?是微软的特性吗?
我不明白难道DSHOW自动render后的FILTER就不会释放了?是微软的特性吗?
#8
我通过手工LOADLIBRARY之后创建成功了AUDIO DECODER和VIDEO DECODER但在连接VIDEODECODER和上游的SPLITTER时IGraphBuilder调用Connect连接两个PIN报错,内容如下:
HRESULT: 0x80040217 (2147746327)
Name: VFW_E_CANNOT_CONNECT
Description: No combination of intermediate filters could be found to make the connection.
Severity code: Failed
Facility Code: FACILITY_ITF (4)
Error Code: 0x0217 (535)
报错时SOURCEFILTER和SPLITTER已经建立了连接,应该不存在取不到数据无法判断媒体类型的情况,FFDSHOW还需要如何设置呢?
HRESULT: 0x80040217 (2147746327)
Name: VFW_E_CANNOT_CONNECT
Description: No combination of intermediate filters could be found to make the connection.
Severity code: Failed
Facility Code: FACILITY_ITF (4)
Error Code: 0x0217 (535)
报错时SOURCEFILTER和SPLITTER已经建立了连接,应该不存在取不到数据无法判断媒体类型的情况,FFDSHOW还需要如何设置呢?
#9
可能和ffdshow注册表里的路径有关,你看看[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\ffdshow]下的库路径,和你装载的路径要一致
#10
遍历
释放
释放
#11
智能联接后,你可以把graph加到rot中去,然后通过ge观查一下,把每个filter记下来,手动连接,也可以手动的release,我想就不会存在你说的问题 了。
#12
楼上所述方式均已尝试过,依然无法释放ffdshow.ax模块,甚至手工创建链路CONNECT PIN来解码REAL格式的媒体时也会有ffdshow.ax模块混进来,一旦混进来就不再出去了!
#13
从你的描述来看肯定有你自己的filter混 进来,你应该从你的filter中找原因。
你最好保证你的filter在ffdshow的filter之前退出。
graph成功退出的条件是每个filter内部处于stop状态。
我的建议是你在stop的时候,你的filter停止活动,清理你的现厂,然后打印调试信息,比如在你的析构中trace,表示你的filter退出。然后观查是否ffdshow还在里面。
如果你的filter在他后退出,就表明是你的问题。
你最好保证你的filter在ffdshow的filter之前退出。
graph成功退出的条件是每个filter内部处于stop状态。
我的建议是你在stop的时候,你的filter停止活动,清理你的现厂,然后打印调试信息,比如在你的析构中trace,表示你的filter退出。然后观查是否ffdshow还在里面。
如果你的filter在他后退出,就表明是你的问题。
#14
我编程试了一下,如果全手动创建graph,手动装载ffdshow.ax,手动连接,关闭后可以卸载ffdshow,没有LZ讲的问题
#15
手动load ffdshow.ax,然后用类工厂创建filter 加到gra中,播放后再停止,再释放所有filter,free ffdshow.ax ,就是会出现ffdshow.ax
还在程序中。我一直就出现。
但是可以肯定的是filter这一层级是释放掉了。因为右下角那个托盘图标不在了。
还在程序中。我一直就出现。
但是可以肯定的是filter这一层级是释放掉了。因为右下角那个托盘图标不在了。
#16
to cici2006,ffdshow.ax就是无法被释放掉吗?
我弄了个简单的例子程序发布在http://www.viewany.com/SimplePlayer2.rar 请Jartru 和wwwllg 帮俺瞧瞧
这个例子里没有用之前说过的loadlibrary方式加载ffdshow.ax,用的是标准的创建COM对象的方式,并手工实现pin的连接。
详见bool CDXGraph::RenderFile(const char * inFile)函数。
释放的时候在void CDXGraph::Release(void)函数里, DSHLP_RemoveAllFilters(mGraph);会遍历fillter逐一清理掉,release函数在析构时会调用。
这个例子支持mp3和flv的回放,测试时可以先播放一个flv文件,再播放一个mp3文件,播放mp3文件前会析构掉CDXGraph对象。
播放mp3前可以用pe查一下ffdshow.ax有加载,播放mp3时依然无法卸载!
怎么办?怎么办?怎么办?怎么办?怎么办?
我弄了个简单的例子程序发布在http://www.viewany.com/SimplePlayer2.rar 请Jartru 和wwwllg 帮俺瞧瞧
这个例子里没有用之前说过的loadlibrary方式加载ffdshow.ax,用的是标准的创建COM对象的方式,并手工实现pin的连接。
详见bool CDXGraph::RenderFile(const char * inFile)函数。
释放的时候在void CDXGraph::Release(void)函数里, DSHLP_RemoveAllFilters(mGraph);会遍历fillter逐一清理掉,release函数在析构时会调用。
这个例子支持mp3和flv的回放,测试时可以先播放一个flv文件,再播放一个mp3文件,播放mp3文件前会析构掉CDXGraph对象。
播放mp3前可以用pe查一下ffdshow.ax有加载,播放mp3时依然无法卸载!
怎么办?怎么办?怎么办?怎么办?怎么办?
#17
好办,好办,好办,把分加多点就好办。呵呵。
我晚上回去帮你看一下。
我晚上回去帮你看一下。
#18
每帖只能加分一次,此帖已加过分,不能再加了
加分不是问题,开了个新帖
http://topic.csdn.net/u/20081028/09/2bb30218-9169-49dd-b117-1c93f25003e6.html
明天给新帖再加100
加分不是问题,开了个新帖
http://topic.csdn.net/u/20081028/09/2bb30218-9169-49dd-b117-1c93f25003e6.html
明天给新帖再加100
#19
粗略看了一下代码,感觉是有的filter对象没有release导致整个graph不能释放,
代码里智能指针,对象指针复制怪多的,是不是这方面的问题
代码里智能指针,对象指针复制怪多的,是不是这方面的问题
#20
To: Jartru 请问是哪个filter没释放呢?
#21
我试过你的代码,好象联接不能成功,在 hr = mGraph->Connect(pPinOut,pPinIn);里不能成功。
我自己改成rendfile没有问题。
或者手动联接都没有问题。
我自己改成rendfile没有问题。
或者手动联接都没有问题。
#22
要安装FFDSHOW,FLVSPLITTER,暴风,KMP里都找得到注册一下就可以
#23
我有装暴风,你的source和解码器什么的都创建成功。就是联接不成功。
#24
暴风影音1才行,暴风II是没有注册FILTER的,另外FFDSHOW还要打开对FLV的解码,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\GNU\ffdshow\flv1设置为1 或者在GraphEdit里右键FFDSHOW DECODER的属性也能设置。
#25
如果是为了播放mp3有必要这么复杂么?
一般的大众格式,应该不局限某种编码,你应该比较通用。
如果用户那里没有安装相应解器是客户的事情。
你也可以把你必须要的filter随产品一起发布。
一般的大众格式,应该不局限某种编码,你应该比较通用。
如果用户那里没有安装相应解器是客户的事情。
你也可以把你必须要的filter随产品一起发布。
#26
不仅仅回放MP3,很多媒体类型都要支持。
且如果让用户播放一个2M的小视频给用户安装一个20M的解码器包会非常影响用户体验,我要动态更新解码器,发现当前解码器解码失败时就下载我准备好的,由于FFDSHOW的无法释放造成必须重新启动程序才能重新加载FFDSHOW,问题是这不正常,我想微软也不是这样设计的!
且如果让用户播放一个2M的小视频给用户安装一个20M的解码器包会非常影响用户体验,我要动态更新解码器,发现当前解码器解码失败时就下载我准备好的,由于FFDSHOW的无法释放造成必须重新启动程序才能重新加载FFDSHOW,问题是这不正常,我想微软也不是这样设计的!
#27
这种情况我也遇到过 可能是pin没释放或者什么的
#28
那你就应该只接renderfile,由用户系统内解码器来决定。一般喜欢看电影的用户都有相关的解码器。
#29
直接renderfile也不是不可以,但是ffdshow依然不会被free,用PE查看一直在进程中加载!
#30
这个帖不能就这么沉了!!
#31
用DShow SDK里的sample来播放同一个文件,看看是否有同样的问题?
#32
Jartru 一句话惊醒梦中人,竟然之前没有跟DX SDK的例子比较,比较后的结果更让我吐血,大家上眼吧:
例子1
D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer
点击close菜单后ffdshow.ax被正常卸载,惊喜!以为有救了!可但是...
例子2
D:\dxsdk\Samples\C++\DirectShow\VMR\Renderless
点击close菜单后ffdshow.ax无法卸载,晕倒
那么如此那就找茬吧,最后发现例子1竟然在close时调用了
CoUninitialize()和CoFreeUnusedLibraries()而例子2的调用是随当前实例的生命周期的生死所以没能卸载掉ffdshow.ax
现在来改我的那个程序,原来的CoInitialize是在app的InitInstance中调用,CoUninitialize在ExitInstance中调用,那么挪到CDXGraph类的构造函数和析构函数里,so easy,ffdshow.ax可以正常释放了。
但是靠这种方法我在主线程中播放结束后难道还要*CoUninitialize?其他COM调用可就遭殃了,或许CoUninitialize不是卸载ffdshow.ax的唯一办法
例子1
D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer
点击close菜单后ffdshow.ax被正常卸载,惊喜!以为有救了!可但是...
例子2
D:\dxsdk\Samples\C++\DirectShow\VMR\Renderless
点击close菜单后ffdshow.ax无法卸载,晕倒
那么如此那就找茬吧,最后发现例子1竟然在close时调用了
CoUninitialize()和CoFreeUnusedLibraries()而例子2的调用是随当前实例的生命周期的生死所以没能卸载掉ffdshow.ax
现在来改我的那个程序,原来的CoInitialize是在app的InitInstance中调用,CoUninitialize在ExitInstance中调用,那么挪到CDXGraph类的构造函数和析构函数里,so easy,ffdshow.ax可以正常释放了。
但是靠这种方法我在主线程中播放结束后难道还要*CoUninitialize?其他COM调用可就遭殃了,或许CoUninitialize不是卸载ffdshow.ax的唯一办法
#33
vmrplayer里面CloseMovie里对那些接口的释放,返回值好像都不是0。
我现在也碰到这种问题,在程序中起了若干个线程做同样的事,在线程中coinitialize()、创建graph,加载过滤器,然后退出前释放掉graph,CoUninitialize。其中一个过滤器是自己写的,第一个线程退出时,过滤器的析构函数未被调用,但以后每次释放都会调用析构函数,不知道是为什么。
而且释放过滤器时EnumFilters只能枚举到render。
我现在也碰到这种问题,在程序中起了若干个线程做同样的事,在线程中coinitialize()、创建graph,加载过滤器,然后退出前释放掉graph,CoUninitialize。其中一个过滤器是自己写的,第一个线程退出时,过滤器的析构函数未被调用,但以后每次释放都会调用析构函数,不知道是为什么。
而且释放过滤器时EnumFilters只能枚举到render。
#34
调用CoUninitialize()后会清理强制COM对象,这样看来确实是你程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放。
如果在 例子1D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer ,中close()里不调用CoUninitialize()是否ffdshow.ax也能释放呢?是不是CoFreeUnusedLibraries()起了作用?
如果在 例子1D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer ,中close()里不调用CoUninitialize()是否ffdshow.ax也能释放呢?是不是CoFreeUnusedLibraries()起了作用?
#35
jartru:
看来确实不是我程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放!
屏蔽了vmrplayer例子中的 QzUninitialize();调用后ffdshow.ax也无法释放了。
再次陷入困境......
看来确实不是我程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放!
屏蔽了vmrplayer例子中的 QzUninitialize();调用后ffdshow.ax也无法释放了。
再次陷入困境......
#36
无满意回复结贴,辛苦分送给大家!
#37
d
#38
把所有的PINS断开就行了。