DirectShow删除链路 和 删除graph中的所有filter
2014-04-11 12:39
330 查看
一般应用DirectShow的时候,我们会封装一个类。
一般情况下,如果摄像头被占用,就无法再次开启。
这里举个例子,如:
在类中声明主要变量;
清理变量;
CCaptureCam
{
IGraphBuilder*
m_pGraphBuilder;
IFilterGraph* m_pFilterGraph;
ICaptureGraphBuilder2 * m_pCaptureGraphBuilder2;
IMediaControl * m_pMediaControl;
IVideoWindow * m_pVideoWindow;
IMediaSeeking * m_pMediaSeeking;
IBaseFilter * m_pSrcFilter;
IBaseFilter * m_pRenderFilter;
IBasicVideo *
m_pBasicVideo;
IBaseFilter *
m_pGrabber;
IMediaEvent * m_pMediaEvent;
IAMVideoProcAmp *
m_pProcAmp;
~CCaptureVideo()
{
//假定变量已经创建,链路已经建立运行;
//删除链路中的所有Filter;
// Stop the graph.
m_pMediaControl->Stop();
// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
hr = m_pGraphBuilder->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
IBaseFilter *pFilter = NULL;
while (S_OK == pEnum->Next(1, &pFilter, NULL))
{
// Remove the filter.
m_pGraphBuilder->RemoveFilter(pFilter);
// Reset the enumerator.
pEnum->Reset();
pFilter->Release();
}
pEnum->Release();
}
//释放变量资源;如果仅仅释放资源,上述中的Filter和链路没有被删;
if(m_pMediaControl)
{
m_pMediaControl->Release();
m_pMediaControl=NULL;
}
if(m_pMediaEvent)
{
m_pMediaEvent->Release();
m_pMediaEvent=NULL;
}
if(m_pVideoWindow)
{
m_pVideoWindow->Release();
m_pVideoWindow = NULL;
}
if(m_pBasicVideo)
{
m_pBasicVideo->Release();
m_pBasicVideo = NULL;
}
if(m_pMediaSeeking)
{
m_pMediaSeeking->Release();
}
if(m_pSrcFilter)
{
m_pSrcFilter->Release();
}
if(m_pRenderFilter)
{
m_pRenderFilter->Release();
}
if(m_pGrabber)
{
m_pGrabber->Release();
}
if(m_pProcAmp)
{
m_pProcAmp->Release();
}
}
}
一般情况下,如果摄像头被占用,就无法再次开启。
这里举个例子,如:
在类中声明主要变量;
清理变量;
CCaptureCam
{
IGraphBuilder*
m_pGraphBuilder;
IFilterGraph* m_pFilterGraph;
ICaptureGraphBuilder2 * m_pCaptureGraphBuilder2;
IMediaControl * m_pMediaControl;
IVideoWindow * m_pVideoWindow;
IMediaSeeking * m_pMediaSeeking;
IBaseFilter * m_pSrcFilter;
IBaseFilter * m_pRenderFilter;
IBasicVideo *
m_pBasicVideo;
IBaseFilter *
m_pGrabber;
IMediaEvent * m_pMediaEvent;
IAMVideoProcAmp *
m_pProcAmp;
~CCaptureVideo()
{
//假定变量已经创建,链路已经建立运行;
//删除链路中的所有Filter;
// Stop the graph.
m_pMediaControl->Stop();
// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
hr = m_pGraphBuilder->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
IBaseFilter *pFilter = NULL;
while (S_OK == pEnum->Next(1, &pFilter, NULL))
{
// Remove the filter.
m_pGraphBuilder->RemoveFilter(pFilter);
// Reset the enumerator.
pEnum->Reset();
pFilter->Release();
}
pEnum->Release();
}
//释放变量资源;如果仅仅释放资源,上述中的Filter和链路没有被删;
if(m_pMediaControl)
{
m_pMediaControl->Release();
m_pMediaControl=NULL;
}
if(m_pMediaEvent)
{
m_pMediaEvent->Release();
m_pMediaEvent=NULL;
}
if(m_pVideoWindow)
{
m_pVideoWindow->Release();
m_pVideoWindow = NULL;
}
if(m_pBasicVideo)
{
m_pBasicVideo->Release();
m_pBasicVideo = NULL;
}
if(m_pMediaSeeking)
{
m_pMediaSeeking->Release();
}
if(m_pSrcFilter)
{
m_pSrcFilter->Release();
}
if(m_pRenderFilter)
{
m_pRenderFilter->Release();
}
if(m_pGrabber)
{
m_pGrabber->Release();
}
if(m_pProcAmp)
{
m_pProcAmp->Release();
}
}
}
相关文章推荐
- DirectShow编程(3.2)- 关于DirectShow - Filter Graph和它的组件
- [DirectShow] 008 - How Hardware Devices Participate in the Filter Graph
- [DirectShow] 005 - About the Filter Graph Manager
- DirectShow编程(3.2)- 关于DirectShow - Filter Graph和它的组件
- DirectShow编程(3.2)- 关于DirectShow - Filter Graph和它的组件
- DirectShow--过滤器图表(Filter Graph)和它的组件
- 自建DirectShow Filter Graph的流程
- DirectShow编程(3.2)- 关于DirectShow - Filter Graph和它的组件
- 添加DMO到directshow filter graph中
- DirectShow体系结构 之 Filter Graph Manager
- DirectShow编程(3.2)- 关于DirectShow - Filter Graph和它的组件
- 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除
- 删除一个目录下的所有文件和文件夹
- linux下删除文本中所有空行的几种方法
- 用rm递归删除子目录下所有.o后缀文件
- 删除线性表中所有值为x的数据元素
- 删除织梦所有待审核稿件sql语句
- oracle删除某个用户所有表
- 删除所有链接\批量删除DB\查询某个用户进程ID执行的操作