关于Filter的释放问题,你们有没有遇到过?

ShutDOT 2008-10-21 06:00:03
例如用ffdshow.ax解码视频进行回放,播放完毕后Stop遍历所有FILTER依次RemoveFilter,对所有FILTER调用release后ffdshow.ax模块依然在当前应用程序进程中(只有一个实例主线程播放,不存在多个引用计数),这种情况大家遇到过吗?同样的问题存在于很多解码器,包括GraphEdit创建完解码链路后清理掉Filter也无法正常freelibrary掉模块!郁闷啊,不释放就不能删除换新的!
...全文
565 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
lztsgx 2010-11-10
  • 打赏
  • 举报
回复
把所有的PINS断开就行了。
joyjjjz 2009-06-12
  • 打赏
  • 举报
回复
d
ShutDOT 2008-11-16
  • 打赏
  • 举报
回复
无满意回复结贴,辛苦分送给大家!
ShutDOT 2008-11-06
  • 打赏
  • 举报
回复
jartru:
看来确实不是我程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放!
屏蔽了vmrplayer例子中的 QzUninitialize();调用后ffdshow.ax也无法释放了。

再次陷入困境......
Jartru 2008-11-06
  • 打赏
  • 举报
回复
调用CoUninitialize()后会清理强制COM对象,这样看来确实是你程序中COM对象(filter, pin)没有正常release导致ffdshow.ax不能释放。
如果在 例子1D:\dxsdk\Samples\C++\DirectShow\VMR\VMRPlayer ,中close()里不调用CoUninitialize()是否ffdshow.ax也能释放呢?是不是CoFreeUnusedLibraries()起了作用?
ShutDOT 2008-11-05
  • 打赏
  • 举报
回复
这个帖不能就这么沉了!!
ccw157 2008-11-05
  • 打赏
  • 举报
回复
vmrplayer里面CloseMovie里对那些接口的释放,返回值好像都不是0。

我现在也碰到这种问题,在程序中起了若干个线程做同样的事,在线程中coinitialize()、创建graph,加载过滤器,然后退出前释放掉graph,CoUninitialize。其中一个过滤器是自己写的,第一个线程退出时,过滤器的析构函数未被调用,但以后每次释放都会调用析构函数,不知道是为什么。

而且释放过滤器时EnumFilters只能枚举到render。
ShutDOT 2008-11-05
  • 打赏
  • 举报
回复
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的唯一办法
Jartru 2008-11-05
  • 打赏
  • 举报
回复
用DShow SDK里的sample来播放同一个文件,看看是否有同样的问题?
ShutDOT 2008-11-03
  • 打赏
  • 举报
回复
直接renderfile也不是不可以,但是ffdshow依然不会被free,用PE查看一直在进程中加载!
UDX协议 2008-11-01
  • 打赏
  • 举报
回复
那你就应该只接renderfile,由用户系统内解码器来决定。一般喜欢看电影的用户都有相关的解码器。
UDX协议 2008-10-31
  • 打赏
  • 举报
回复
如果是为了播放mp3有必要这么复杂么?

一般的大众格式,应该不局限某种编码,你应该比较通用。

如果用户那里没有安装相应解器是客户的事情。

你也可以把你必须要的filter随产品一起发布。
czbever 2008-10-31
  • 打赏
  • 举报
回复
这种情况我也遇到过  可能是pin没释放或者什么的
ShutDOT 2008-10-31
  • 打赏
  • 举报
回复
不仅仅回放MP3,很多媒体类型都要支持。

且如果让用户播放一个2M的小视频给用户安装一个20M的解码器包会非常影响用户体验,我要动态更新解码器,发现当前解码器解码失败时就下载我准备好的,由于FFDSHOW的无法释放造成必须重新启动程序才能重新加载FFDSHOW,问题是这不正常,我想微软也不是这样设计的!
UDX协议 2008-10-30
  • 打赏
  • 举报
回复
我有装暴风,你的source和解码器什么的都创建成功。就是联接不成功。
ShutDOT 2008-10-30
  • 打赏
  • 举报
回复
暴风影音1才行,暴风II是没有注册FILTER的,另外FFDSHOW还要打开对FLV的解码,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\GNU\ffdshow\flv1设置为1 或者在GraphEdit里右键FFDSHOW DECODER的属性也能设置。
ShutDOT 2008-10-29
  • 打赏
  • 举报
回复
To: Jartru 请问是哪个filter没释放呢?
ShutDOT 2008-10-29
  • 打赏
  • 举报
回复
要安装FFDSHOW,FLVSPLITTER,暴风,KMP里都找得到注册一下就可以
UDX协议 2008-10-29
  • 打赏
  • 举报
回复
我试过你的代码,好象联接不能成功,在 hr = mGraph->Connect(pPinOut,pPinIn);里不能成功。

我自己改成rendfile没有问题。

或者手动联接都没有问题。
ShutDOT 2008-10-28
  • 打赏
  • 举报
回复
每帖只能加分一次,此帖已加过分,不能再加了

加分不是问题,开了个新帖

http://topic.csdn.net/u/20081028/09/2bb30218-9169-49dd-b117-1c93f25003e6.html

明天给新帖再加100
加载更多回复(18)

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧