opencv cvCaptureFromAVI cvReleaseCapture thread failure

在Opencv中,使用cvCaptureFromAVI打开一个视频文件后,并使用cvReleaseCapture释放关闭它后,再开启一个线程使用cvCaptureFromAVI打开一个视频文件,此时就会出现错误,在调试中,执行这个“CvCapture *capture = cvCaptureFromAVI( m_strVideoPath ); ”语句后也会出现capture的内存取值为0x00000000,也就是在多线程中cvCaptureFromAVI不能多次使用, cvReleaseCapture这个语句没有彻底执行,后来查到"OpenCV在多线程下不能读取AVI视频新的解决办法http://blog.sina.com.cn/s/blog_78f6d29e0100qc3t.html

"

之前OpenCV在多线程下读取AVI视频不奏效的问题解决了好久,后来不得已换成了AVI stream来解码。本以为是解决了,在我的笔记本上和台式机上都正常的运行,可是到了别人的XP系统中又不能运行了,这样才真正的涉及到本质问题,一样是不行的,为什么呢?查了很久,之前AVIFILEOPEN这个函数的返回值始终是-2147221008,可是都没有找到本质原因,后来才发现,要把这个代码换成16进制就可以搜索到很多相关的项目了。原来不是什么OpenCV的bug,是因为多线程使用前必须加一句CoInitialize(NULL);来对线程进行一个初始化。把这个简单的话加到AVIStream解码中和OpenCV解码的前面,发现这两种解码的方式都可以正常运行了。这个问题困扰了我好几天,却通过这么曲折的方式解决掉,实在让我有点意外。上网查了一下,发现这两个函数用来设置COM库的,可是我怎么知道OpenCV和AVIStream或者是XVID里面是否用到了COM库呢?哎,只能吃哑巴亏了,也不可能从头到尾去专研这个,毕竟只是一个工具而已,下次记住就OK了。
 
注:
CoInitialize是用来初始化COM库的;
CoUninitialize是用来对COM库做些清理工作的;
CoInitialize Function

Initializes the COM library on the current thread and identifies the concurrency model as single-thread apartment (STA).New applications should call CoInitializeEx instead of CoInitialize.

"

也就是在线程处理函数中,分别在函数头和函数尾加上 CoInitialize(NULL); 和 CoUninitialize();  这样就可以在多线程下多次读取视频文件了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值