DirechShow编程,怎样遍历IGraphBuilder中的Filter,然后释放Filter占用的资源??

lingbin 2003-08-19 08:51:28
遍历一个IGraphBuilder中的所有Filter,然后释放掉这些Filter占用的系统资源,我知道是用Release来释放,可是我现在的程序用Release来释放的时候,竟然释放不完,每播完一首歌就要占用系统资源的2%,再播个几首歌后,边系统资源都没有了,怎么办啊,能不能帮我写一个可以遍历整个IGraphBuilder中的Filter,然后全部释放掉这些Filter占用的系统资源,叫它从开始占用的系统资源是多少到结束播放时还是占用那么多的系统资源,各位高手帮帮忙啊。
...全文
135 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingbin 2003-08-20
  • 打赏
  • 举报
回复
Release掉DecoderFilter后,还有指针指向它,怎么办,怎样子删除掉指向它的指针???
lingbin 2003-08-20
  • 打赏
  • 举报
回复
to jackyuke(jack) :
用了你那个函数还是释放不了系统资源,是不是要打什么补丁才行啊。
mfcstarter 2003-08-19
  • 打赏
  • 举报
回复
jackyuke(jack) ,帮忙看看,谢谢!!!
http://expert.csdn.net/Expert/topic/2164/2164652.xml?temp=6.315249E-02
lingbin 2003-08-19
  • 打赏
  • 举报
回复
to jackyuke(jack) :
我在播放文件之前调用你给我的函数,播放第一首歌那个pGraph是NULL所以就没有调用,播放第二首歌的时候,那个pGraph不是NULL,所以就调用到它,可是调用后,却创建不了DecoderFilter了,为什么?
jackyuke 2003-08-19
  • 打赏
  • 举报
回复
HRESULT EnumFilters (IFilterGraph *pGraph)
{
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter;
ULONG cFetched;

HRESULR hr = pGraph->EnumFilters(&pEnum);
if (FAILED(hr)) return hr;

while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
{
FILTER_INFO FilterInfo;
hr = pFilter->QueryFilterInfo(&FilterInfo);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("Could not get the filter info"),
TEXT("Error"), MB_OK | MB_ICONERROR);
continue; // Maybe the next one will work.
}

#ifdef UNICODE
MessageBox(NULL, FilterInfo.achName, TEXT("Filter Name"), MB_OK);
#else
char szName[MAX_FILTER_NAME];
int cch = WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName,
MAX_FILTER_NAME, szName, MAX_FILTER_NAME, 0, 0);
if (chh > 0)
MessageBox(NULL, szName, TEXT("Filter Name"), MB_OK);
#endif

// The FILTER_INFO structure holds a pointer to the Filter Graph
// Manager, with a reference count that must be released.
if (FilterInfo.pGraph != NULL)
{
FilterInfo.pGraph->Release();
}
pFilter->Release();
}

pEnum->Release();
return S_OK;
}

试试看
最近学了一些游戏开发必不可少的MP3文件播放知识。首先,我的目标机器是windows,所以这些是在windows平台下开发的。随后我学到,要直接解码MP3文件是非常的困难的。因为MP3文件的闭源,我们都没有知道怎样才能一个一个地解码。好在DirectShow帮我们解决了解码的工作,我们需要的只是加入头文件,并且手动链接库文件,使用它的函数就行了。 为了使用它的函数,我们必须加入头文件dshow.h。这个头文件是不容易找到的。以后的DirectX里面都没有了DirectShow的踪影。我只好下载2004年十二月的DirectX版本,这个版本里就有dshow.h。好了,我们加入这个头文件不外乎就是要加一些接口。这里我列举这一些接口的名字: IGraphBuilder IMediaControl IMediaEventEx 为了能够解析IGraphBuilder这个符号,我们还要手动地链接Strmiids.lib库。这个库不是特别的显眼,但是没有它我们的程序就无法通过。 好了,准备工作做好了后,我们开始写一个类了。这个类很简单,叫CMP3。这个类里面嵌入了另外一个MP3标签类CMP3Tag。下面就是我这个类的代码。 class CMP3 { public: CMP3( void ) // 默认构造函数 { m_GraphBuilder = NULL; m_MediaControl = NULL; m_MediaEventEx = NULL; m_IsPlaying = false; } ~CMP3( void ); // 析构函数 bool LoadMP3File( TString strFilename ); // 读取MP3文件 bool Play( void ); // 播放MP3文件 void ProcessNotification( void ); // 处理通知 CMP3Tag GetMP3Tag( void ) { return m_tag; } // 获取MP3标签 bool IsPlaying( void ) { return m_IsPlaying; } // 判断是否正在播放 private: bool m_IsPlaying; IGraphBuilder* m_GraphBuilder; IMediaControl* m_MediaControl; IMediaEventEx* m_MediaEventEx; CMP3Tag m_tag; };

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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