DirectShow: 象这样释放DirectShow资源,ActiveMovieWindow窗口为何没有正常销毁?

wmrwinhap 2004-12-23 11:31:55
下面贴出来我的DirectShow初始化及销毁的主要代码

程序运行后,调用DirectShowInit能初始化成功,并能正常播放视频,但是调用DirectShowFree后,经常出现虽然最后一帧视频输出不再显示了,但是有两个奇怪的现象:
1. 窗口没有恢复原来的背景色,还是ActiveMovieWindow的黑色背景
2. 重新调用DirectShowInit并播放视频时,有时出现窗口内视频播放正常,但桌面左上角还出现了一个ActiveMovie窗口

感觉是原来调用DirectShowFree时原ActiveMovieWindow并没有销毁.

是我的DirectShowFree的代码有问题吗?盼高手指教!!!


CDlg::Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pFilter=NULL;
m_pGraph=NULL;
m_pBaseFilter=NULL;
m_pMediaControl=NULL;
m_pVideoWindow=NULL;

CoInitialize(NULL);

// 创建 GRAPH
if(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&m_pGraph)!=S_OK) m_pGraph=NULL;
}

CDlg::~CDlg()
{
// 如果DirectShow已初始化但未释放
DirectShowFree();

// 释放 GRAPH
if(m_pGraph) {
m_pGraph->Release();
m_pGraph=NULL;
}

CoUninitialize();
}

HRESULT CDlg::DirectShowInit()
{
HRESULT hr=S_FALSE;

if(m_pGraph) {
// 取得 IID_IVideoWindow 接口
hr=m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&m_pVideoWindow);
if(SUCCEEDED(hr)) {
m_pVideoWindow->put_AutoShow(OAFALSE);

// 添加自定义的FILTER,因为是专用FILTER,无需注册,直接创建FILTER对象加入GRAPH即可
m_pFilter=new CNvsFilter(m_nSrcWidth, m_nSrcHeight, NULL, &hr);
if(m_pFilter) {
m_pFilter->AddRef();

m_pBaseFilter=NULL;
hr = m_pFilter->QueryInterface(IID_IBaseFilter,(void**)&m_pBaseFilter);
if(SUCCEEDED(hr)) {
hr=m_pGraph->AddFilter(m_pBaseFilter,L"NVS Filter");
if(SUCCEEDED(hr)) {
IPin* pOutPin=0;
// 取未连接的PIN,自定义FILTER有一个YUY2格式的输出PIN
hr=GetUnConnectedPin(m_pBaseFilter,PINDIR_OUTPUT,&pOutPin);
if(SUCCEEDED(hr)) {
// 自动连接显示FILTER以播放YUY2媒体流
hr=m_pGraph->Render(pOutPin);
pOutPin->Release();
if(SUCCEEDED(hr)) {
// 初始化ActiveMovieWindow
m_pVideoWindow->put_Owner((OAHWND)m_hWnd);
m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
m_pVideoWindow->SetWindowPosition(m_nDispX, m_nDispY, m_nDispWidth, m_nDispHeight);
m_pVideoWindow->put_Visible(OATRUE);
m_pVideoWindow->SetWindowForeground(OATRUE);
m_pVideoWindow->put_MessageDrain((OAHWND)m_hWnd);

hr=m_pGraph->QueryInterface(IID_IMediaControl,(void**)&m_pMediaControl);
if(SUCCEEDED(hr)) {
// 运行GRAPH
hr=m_pMediaControl->Run();
if(SUCCEEDED(hr)) TRACE("DirectShow Graph Running ...\n");
else TRACE("DirectShow Graph run fail\n");
} else TRACE("QueryInterface IID_IMediaControl fail\n");
} else TRACE("Graph render fail\n");
} else TRACE("Get output pin fail\n");
} else TRACE("AddFilter into graph fail\n");
} else TRACE("QueryInterface IID_IBaseFilter fail\n");
} else {
hr = E_OUTOFMEMORY;
TRACE("New NVS-Filter object fail\n");
}
} else TRACE("QueryInterface IID_IVideoWindow fail\n");

if(FAILED(hr)) {
if(m_pVideoWindow) {
if(m_pFilter) {
if(m_pBaseFilter) {
if(m_pMediaControl) {
m_pMediaControl->Stop();
m_pMediaControl->Release();
m_pMediaControl=NULL;
}
m_pGraph->RemoveFilter(m_pBaseFilter);
m_pBaseFilter->Release();
m_pBaseFilter=NULL;
}
delete m_pFilter;
m_pFilter=NULL;
}
m_pVideoWindow->put_MessageDrain((OAHWND)NULL);
m_pVideoWindow->put_Visible(OAFALSE);
m_pVideoWindow->Release();
m_pVideoWindow=NULL;
}
}
}

return hr;
}

void CDlg::DirectShowFree()
{
if(m_pGraph) {
if(m_pVideoWindow) {
// 销毁ActiveMovieWindow
m_pVideoWindow->put_MessageDrain((OAHWND)NULL);
m_pVideoWindow->put_Visible(OAFALSE);
m_pVideoWindow->Release();
m_pVideoWindow=NULL;

// 销毁Filter
if(m_pFilter) {
if(m_pBaseFilter) {
if(m_pMediaControl) {
hr=m_pMediaControl->Stop();
m_pMediaControl->Release();
m_pMediaControl=NULL;
}
hr=m_pGraph->RemoveFilter(m_pBaseFilter);
m_pBaseFilter->Release();
m_pBaseFilter=NULL;
}
delete m_pFilter;
m_pFilter=NULL;
}
}
}
}
...全文
318 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2004-12-24
  • 打赏
  • 举报
回复
该死的MSN,它把你的邮件当作垃圾邮件了,难怪半天我没看到。
wmrwinhap 2004-12-24
  • 打赏
  • 举报
回复
to: DentistryDoctor(雅克医生<改行做程序员了>)
源代码已发送,请查收邮件,谢谢!

to::changpei(饱汉不知饿汉饥,饿了一日,方知饿乃天下第一大事!)
我在DirectShowFree中没有释放mGraph,是因为释放后经常出现在DirectShowInit中创建mGraph失败,我也不知道原因,是不是因为没有调用RemoveFromObjectTable()的原故?你这里的RemoveFromObjectTable() 是干什么用的?如何实现?
能否留下你的email,我把源代码发一份给你,帮我看看?谢谢 !
张佩 2004-12-24
  • 打赏
  • 举报
回复
void CDXGraph::Release(void)
{
if (mSeeking)
{
mSeeking->Release();
mSeeking = NULL;
}
if (mMediaControl)
{
mMediaControl->Release();
mMediaControl = NULL;
}
if (mEvent)
{
mEvent->Release();
mEvent = NULL;
}
if (mBasicVideo)
{
mBasicVideo->Release();
mBasicVideo = NULL;
}
if (mBasicAudio)
{
mBasicAudio->Release();
mBasicAudio = NULL;
}
if (mVideoWindow)
{
mVideoWindow->put_Visible(OAFALSE);
mVideoWindow->put_MessageDrain((OAHWND)NULL);
mVideoWindow->put_Owner(OAHWND(0));
mVideoWindow->Release();
mVideoWindow = NULL;
}
RemoveFromObjectTable();
if (mGraph)
{
mGraph->Release();
mGraph = NULL;
}
}
DentistryDoctor 2004-12-24
  • 打赏
  • 举报
回复
将程序发给我看一下。
DentistryDoctor@msn.com
wmrwinhap 2004-12-24
  • 打赏
  • 举报
回复
Help !!!
内容概要:本文针对传统彩色数字图像加密算法存在的密钥空间有限、随机性不足及抗干扰能力弱等问题,提出一种结合混沌系统与DNA编码的复合型彩色图像加密解密方案。通过混沌系统生成伪随机序列,对图像RGB三通道像素进行置乱与混淆,并利用DNA编码规则实现信息的高维扩散与并行处理,从而提升加密强度与安全性。文章重点对该方案的抗噪声与抗裁剪性能进行了系统性分析,实验结果表明该算法具备大密钥空间、强加密随机性,且在面对高斯噪声、椒盐噪声干扰及不同程度裁剪攻击时仍能较好恢复图像内容,展现出优良的鲁棒性与实用性。; 适合人群:具备一定图像处理、密码学基础知识的科研人员及研究生,或从事信息安全、多媒体通信领域的技术人员。; 使用场景及目标:①应用于网络环境下的彩色图像安全传输与私密存储,防范信息窃取与篡改;②为高鲁棒性图像加密技术的研究提供理论支持与实验验证,推动复合加密算法在实际工程中的落地应用。; 阅读建议:建议读者结合文中提出的加密流程与实验设计,自行复现算法并对不同类型的图像数据进行测试,重点关注混沌参数敏感性、DNA编码规则选择及不同干扰场景下的解密效果,以深入理解算法的抗干扰机制与优化空间。
【不讲道理,只给数据】网上讲 JS 性能的文章大多只给结论不给数据。这个包把 8 个常见优化手法真的跑了一遍,把耗时与提速倍数写出来——包括 3 项「优化后反而更慢」的结果。 ■ 实测(本机 node 实跑,见包内 04 文件) · 按 id 查找:Map 代替 find → 680 倍 · 数组去重:Set 代替双重循环 → 90 倍 · 记忆化递归:加缓存 → 800 倍 · 深拷贝:structuredClone 反而比 JSON 慢(0.44x) · 字符串拼接:现代 V8 下 += 与 join 几乎无差别(0.9x) ■ 资源内容 · 01_优化实战/:bench.js + run_all.js,8 项 before/after 基准,可直接跑,也能改成测你自己的代码 · 02_单元测试示例/:6 个工具函数 + Node 内置测试器写的测试(零依赖,不用装 Jest) · 03_工程化配置模板/:ESLint 9 扁平配置、Prettier、Vite 手动分包、Webpack 5 持久化缓存、package.json 脚本 + 逐项说明 · 04/05 真实运行结果:程序实跑输出,非手写示例 · 06_优化清单30条.md:每条标注实测结论 · 07_自检脚本:一键重跑测试与基准 ■ 使用方法 1)只需 Node 18+,不用 npm install:node 01_优化实战/run_all.js 即可看对比表 2)单元测试:cd 02_单元测试示例 && node --test 3)用 bench.js 量你项目里最慢的函数,先记基线再动手改 4)工程化配置直接拷进项目,重点看 03 里「为什么这么配」 ■ 说明 全部代码原创,可直接用于你的项目。基准数字因 CPU 与 Node 版本略有差异,趋势一致。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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