使用DirectShow+VS2012预览、录制摄像头视频,播放本地视频

最近,由于工程中需要使用到摄像头。我就利用opencv3.0.0+VS2012对自己笔记本的摄像头进行程序开发。测试成功之后,将代码移植到目标机器却出现打开摄像头黑屏的现象。目标机器也安装有VS2012和opencv3.0.0,不同的只是摄像头。后来发现目标机器的摄像头是UVC Camera。与厂家联系之后发现它只能由DirectShow来开发。

一、了解一下UVC:

UVC,全称为:USB video class 或USB video device class。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准。使用 UVC 的好处 USB 在 Video这块也成为一项标准了之后,硬件在各个程序之间彼此运行会更加顺利,而且也省略了驱动程序安装这一环节。(摘自百度百科:https://baike.baidu.com/item/DirectShow/181101?fr=aladdin

有些摄像头遵循USB协议,而有些则遵循UVC协议,这些可能就是导致opencv无法打开UVC摄像头的原因。

二、DirectShow

DirectShow是微软推出的新一代基于COM(Component Object Model)的流媒体处理的开发包。DirectShow使用一种叫Filter Graph的模型来管理整个数据流的处理过程。目前关于它的中文书籍只有陆其明的《DirectShow开发指南》、《DirectShow实务精选》。在我开发程序时查找资料的过程中,我发现貌似这项技术现在使用的人不多了,因为查看的所有CSDN论坛最新也是2010年的了,还有其他博客对于DirectShow的解释和实例也不尽如人意。

我自己在学习的过程中也并没有明白多少,只是一步一步的探索,下面我将我查找到的资料和我遇见的问题分享给大家。

https://blog.csdn.net/ett_qin/article/details/86692191或者https://www.cnblogs.com/signal/p/4094099.html

还有陆其明的《DirectShow开发指南》pdf版,DirectShow的SDK,和我自己写的摄像头视频预览与录制类:

链接:https://pan.baidu.com/s/1u2l6btA7qNl-1PnULMtyPw 提取码:zcip (因为CSDN下载需要积分,所以就分享到百度云了)

我的问题:

1、为了录制视频,需要执行RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,mpVideoFilter,NULL,mpMux);函数,但却返回了一个错误值:-2147220897。

原因:在执行RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,mpVideoFilter,NULL,mpMux);之前有过如下语句的执行:

RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, mpVideoFilter,NULL, NULL);
mpVideoMediaControl->Run();//mpVideoMediaControl是IMediaControl类的对象,用于控制filter graph中所有filter的启停

在mpVideoMediaControl->Run()之后是无法再继续使用RenderStream连接filter的,需要先停止,即:mpVideoMediaControl->Stop()后才能再执行RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,mpVideoFilter,NULL,mpMux);

2、RenderStream连接之后不会断开。我查找很多资料都没有查到如何断开RenderStream的连接。这样就使我无法在录制完毕之后只关闭录制而不关闭预览。也无法重复录制,因为不能重复RenderStream相同的filter。

我只能通过效率低下的方法来解决:每次预览、录制都关闭摄像头再打开。

3、本地视频的播放

本地视频的播放很简单,但是DirectShow无法获取到视频的帧数(时长),用户无法快进/退视频,所以仍然使用opencv播放本地视频。(分享的文件中有本地视频播放的程序)

 

郑重声明:分享的资料只用于学习交流使用,不可用于商业使用,若有违反,后果自负!!

相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

ett_qin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值