免责声明:仅供研究讨论,未经确认,内容与提供之源码,严禁商用!!!

先提一些题外话,在微软关于DirectShow的官网上有如下说明:

https://docs.microsoft.com/zh-cn/windows/win32/directshow/directshow

所以我这里去Windows官网下载Sdk,从中获取新版的DirectShow,但microsoft似乎对DirectShow后续改动其实并没有特别多,

https://developer.microsoft.com/en-us/windows/downloads/sdk-archive

因为目前我用的系统是Win7,所以我暂时下载的如下版本的SDk。

安装完成后,我这里在C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow中有directshow相关的SDK包。

回归正题,通常DirectShow原始SDK包没有自带驱动H264/H265流格式摄像头的filter。

但是通过查找Github上的开源项目libde265(https://github.com/strukturag/libde265),在其README.md说明中可以翻看到如下一段。

Libde265 has been integrated into these applications:

- gstreamer plugin, [source](https://github.com/strukturag/gstreamer-libde265), [binary packages](https://launchpad.net/~strukturag/+archive/libde265).

- VLC plugin [source](https://github.com/strukturag/vlc-libde265), [binary packages](https://launchpad.net/~strukturag/+archive/libde265).

- Windows DirectShow filters, https://github.com/strukturag/LAVFilters/releases

- ffmpeg fork, https://github.com/farindk/ffmpeg

- ffmpeg decoder [source](https://github.com/strukturag/libde265-ffmpeg)

- libde265.js JavaScript decoder [source](https://github.com/strukturag/libde265.js), [demo](https://strukturag.github.io/libde265.js/).

由上,我们可以直接下载上述DirectShow的第三方filter导入即可拿来解码H265码流,由于目前小编手头还没有H265格式输出的UVC摄像头,现以H264为例。

介绍如何导入新的Filter,以及如何使用第三方filter完成解码操作。这里我将采用sourceforge上的另一个开源Filter(http://hax264.sourceforge.net/)项目,箭头处可进入下载页面下载相关开源的源码和Release包。

下载好Hax264_setup_1_0_0.exe后,安装,你将会得到以下文件。

接下来我们要做的是注册组件,filter实际就是COM组件,可使用命令行注册,这里由于上述路径中有空格,我将其移到了D盘,此外运行cmd.exe时,要以管理员身份运行,如下:

补充一点,以上注册组件的这个步骤要特别注意,这个路径一旦确定以后,里面的库等资源就不要移动到别的地方去了,否则,会导致运行我们的解码程序时找不到资源模块,这不但会导致你的程序Crash,在使用GraphEdit添加Filter时,也会提示找不到模块。

接下来打开DirectShow的GraphEdit.exe可以发现在枚举系统的DirectShow Filters时,多了我们刚刚注册的Filter,如下:

接下来,由于我的摄像头有多个输出pin及多种输出格式,我配置我的UVC摄像头输出格式为H264-1080P输出,如下图:

在H264 DS Filter上右击配置属性,我们有两种输出格式可以配置如下:

以上已经可以点亮摄像头,接下来,我们通过代码去实现上述Com连接,并取样图像。

首先我们在代码中创建该Filter时,需要一个唯一ID,我们可以通过在Insert Filter页面查看:

该处后面的ID中即有我们需要的ID,于是可新增定义如下:

#define MYDEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \

EXTERN_C const GUID DECLSPEC_SELECTANY name \

= { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }

// 43FC6785-8E56-4ED6-9CCC-9F3556AC9D24

MYDEFINE_GUID(CLSID_H264DS,0x43FC6785, 0x8E56, 0x4ED6, 0x9C, 0xCC, 0x9F, 0x35, 0x56, 0xAC, 0x9D, 0x24);

// H.264 compressed video stream

// 34363248-0000-0010-8000-00AA00389B71  'H264' == MEDIASUBTYPE_H264

MYDEFINE_GUID(MEDIASUBTYPE_H264,0x34363248, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);

// 创建H264解码接口

IBaseFilter *m_pH264Filter;

hr =  CoCreateInstance(CLSID_H264DS,0,CLSCTX_INPROC,IID_IBaseFilter,

(void**)&m_pH264Filter);//声明第二个filter

if(hr == S_FALSE) return hr;

//添加H264 Filter到Graph中

hr = m_pGraphFilter->AddFilter(m_pH264Filter,L"H264 DS Filter");

if (hr == S_FALSE)  return hr;

这里上传了一个我编写的示例程序资源:

https://download.csdn.net/download/tanjiaqi2554/11691879

以上资源可驱动点亮该格式输出的UVC摄像头,编译的时候需要正确设置你的DirectShow的包含头文件目录路径和库路径,如下:

以上可能报错,如果是7.0A版本以后的DirectShow可能缺少Qedit.h,没关系【它在老版本9.0中是有的】,这个文件我也单独上传了,直接复制到DirectShow头文件目录下即可,如下:

如何使用DirectShow驱动H264/H265格式输出的UVC摄像头相关推荐

  1. iOS H264,H265视频编码(Video encode)

    本例需求:使用H264, H265实现视频数据的编码并录制开始200帧存为文件. 原理:比如做直播功能,需要将客户端的视频数据传给服务器,如果分辨率过大如2K,4K则传输压力太大,所以需要对视频数据进 ...

  2. RTP协议解析及H264/H265 音视频RTP打包分析

    一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...

  3. H264/H265码流类型

    文章目录 H.264码流 H.264码流格式 Annex B AVCC H.265码流 H.264码流 H264中,NALU类型1-5为视频帧,其余则为非视频帧.在解码过程中,我们只需要取出NALU头 ...

  4. RTP协议封装H264/H265/AAC

    <RTSP实时音视频传输介绍> 目录 一.前言 二.RTP基本格式介绍 1.RTP 固定头 2.RTP 扩展头 3.RTP 载荷 三.RTP封装H264 1.封装包类型 四.RTP封装H2 ...

  5. ffmpeg录制H265格式的桌面视频

    ffmpeg本身不支持H265,如果需要支持,需要事先编译出libx265,读者可以到libx265的官方网站https://www.videolan.org/developers/x265.html ...

  6. 选择最新 Chromium,支持 H264 / H265

    在做了充分的准备后,我信心满满的向着 H265 8K 视频解码这个目标发起进攻,然而,正打算动手的时候,我突然发现,别说支持 H265 ,自编的 Chromium WebView 连 H264 解码都 ...

  7. linux系统print命令,linux常用命令 print格式输出

    格式化输出命令 printf '输出类型 输出格式' 输出内容 输出类型: %ns 输出字符串,n是数字指代输出的几个字符 %ni 输出整数,n是数字指代输出几个数字 %m.nf 输出浮点数.m和n是 ...

  8. ACMNO.34 C语言-格式输出 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用6.2f格式输出。

    题目描述 请设计输出实数的格式, 包括: ⑴一行输出一个实数:⑵一行内输出两个实数:⑶一行内输出三个实数. 实数用"6.2f"格式输出. 输入 一个实数,float范围 输出 输出 ...

  9. ACMNO.11 一个数如果恰好等于它的因子之和,这个数就称为“完数“。 例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数“。 编程序找出N之内的所有完数,并按下面格式输出其因子

    写在前面,心得感悟~ 代码越来越有难度! 这个ACM题,我调试了 将近50次~ 一个小时! 真的是,年纪轻轻的搞什么ACM呀! 关于题的解决思路放在下面再写吧! 题目描述 一个数如果恰好等于它的因子之 ...

最新文章

  1. Django实战(20):分页(Pagination)
  2. ios获取手机 meid_共享充电宝并不简单,iOS也顶不住,隐私信息直接暴露
  3. 【转载】 Searching过程粗略梳理
  4. 网络经济与企业管理(第 2 章:企业战略管理)
  5. linux 内核模块开发,Linux内核模块开发(笔记)
  6. php curl登陆邮箱,php利用CURL函数登入163邮箱并获取自己的通讯录
  7. 机器学习速成课程 | 练习 | Google Development——编程练习:TensorFlow 编程概念
  8. java怎样获取变量的类型
  9. 深度学习自学(二十一):连续保存人脸检测、关键点检测后人脸状态-循环队列实现
  10. org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
  11. 简易RAM的C++实现
  12. 【Docker】05 容器数据卷
  13. [JSOI2017]原力(分块+map(hash))
  14. windows服务定时重启软件的实现
  15. VBScript编程教程 [下]
  16. PIC单片机-Mplab的使用与实践
  17. esp分区引导修复失败_ESP分区丢失,新建ESP分区修复引导教程
  18. 自由职业接单,大平台,有保障
  19. Bat(批处理)文件编写手册(一)
  20. 日语与计算机论文,日语毕业论文指导初探

热门文章

  1. mfc 多边形绘制
  2. 【Android 教程系列第 11 篇】安卓手机的制造商有哪些
  3. 前端项目实战134-前端实战项目部署线上刷新错误
  4. Head First设计模式(阅读笔记)-04.工厂模式
  5. DirectX 9.0 (4)环境光和反射光
  6. python字符串模糊匹配_NLP教程:用Fuzzywuzzy进行字符串模糊匹配
  7. 【Nginx系列】Nginx配置使用与工作原理
  8. 简约计算器效果 html+css
  9. 车灯的测试过程中的芯片载板烧录问题
  10. openfire+spark+smack