Directshow(SDK)学习笔记

合集下载

DirectShow之接口实战篇

DirectShow之接口实战篇

在正确安装好DirectX SDK后,我们必须设置DirectX SDK的头文件和库文件,使其在Visual Studio的搜索路径内。

对于Visual Studio .NET 2003可如下进行设置:菜单→工具→选项→项目→VC++目录,在包含文件中加入D:\DXSDK\Include,在库文件中加入D:\DXSDK\lib(我的SDK的安装路径是D:\DXSDK):头文件文件名称描述Dshow.h所有的DirectShow应用都必须包含库文件文件名称描述Strmiids.lib此库文件中导出类标识(CLSID)和接口标识(IID),所有的DirectShow应用都必须包含此文件。

Quartz.lib此库文件中导出函数AMGetErrorText,如果你的程序中调用了此函数,则必须包含此库文件。

DirectShow之接口实战篇(一)现今自己编程做一个多媒体播放工具是一件很令人开心愉悦的事情,但如果使用MediaPlay 控件开发则会受到很多限制,自己的很多好的创意想法都无法或者很难实现,如果利用微软的DirectX接口开发则可以充分的将作者的独特想法付诸于实现,何乐而不为呢!!不过关于DirectShow接口的开发说明文档实在是少之又少,仅有的一些不是英文的就是一些关于理论方面的,真正关于接口实战编程而且是用Delphi开发工具实现的更是凤毛麟角,使很多人都望而却步。

在这里,我把我应用Directshow开发的心得以及我搜集到一些资料重新整理编辑出来公布,希望对所有由此兴趣的同仁有所帮助,就算达到了我的目的。

废话少说,进入正文。

既然是接口实战篇,就先把一些常用的接口列出来,让大家有一些基本的认识,都是用来做什么的,什么时候我们会需要用到此接口。

IFilterGraph 过滤通道接口IFilterGraph2 增强的IFilterGraphIGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph ManagerIMediaControl 用来控制流媒体,例如流的启动和停止暂停等,播放控制接口IMediaEvent 播放事件接口,该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序IMediaEventEx 扩展播放事件接口IMediaPosition 播放的位置和速度控制接口(控制播放位置只能为设置时间控制方式)IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强.设置播放格式,多种控制播放方式.常用的有:(1)TIME_FORMAT_MEDIA_TIME单位100纳秒。

DirectX3D SDK 基础教程(一)

DirectX3D SDK 基础教程(一)

DirectX3D SDK 基础教程(一)Direct3D 10 基础Tutorial 1: Direct3D 10 Basics概述在这第一篇教程中,我们将通过一些必要的元素去创建一个最小的Direct3D 10 应用. 每一个 Direct3D 10 应用都必须有这些功能元素对应功能属性. 这些元素包括设置窗口和设备对象,然后在窗口中显示一种颜色。

设置Direct3D 10 设备现在我们在一个只有一个空窗体的工程中, 去设置一个 Direct3D 10 设备, 如果你想去渲染任何一个3D 场景,设置3D 设备是非常必要的。

我们首先要做的是去创建2个对象:一个设备和一个交互链。

应用程序使用设备对象在缓冲区上执行渲染。

设备也包含了去创建资源的方法。

交互链对象的责任是从缓冲区中获得数据,这些数据是将被设备对象渲染并显示在显示器屏幕上。

交互链对象包含两个或更多地缓冲区,主要分为前端和后端缓冲区。

前端缓冲区是当前正在被显示给用户的数据,大多是设备对象渲染的材质,前端缓冲区是只读的,不能被修改。

后端缓冲区是渲染目标,就是设备将要渲染的材质。

一旦完成了绘画操作,这个交互链对象将显示后端缓冲区。

通过交互两个缓冲区,这个后端缓冲区变成了前端缓冲区。

为了创建交互链对象,我们要填写一个DXGI_SWAPCHAIN_DESC 结构体,这个结构体是我们要创建的交互链的描述。

有几个字段值的我们去说一下.BackBufferUsage 是一个标志字段,告诉应用程序怎样去使用后端缓冲区。

如果我们想去渲染后端缓冲区,我们就要设置 BackBufferUsage 标志为 DXGI_USAGE_RENDER_TARGET_OUTPUT.OutputWindow 字段代表窗口,交互链使用这个窗口去显示图像到屏幕上。

SampleDesc 被用来打开duo重采样. 由于这个教程不做多重采样,所以SampleDesc的 Count 被设置到 1,并且Quality被设置到 0 去关闭此功能。

directx SDK官方教程

directx SDK官方教程

Tutorial 1: Creating a DeviceDirect3D 9 的样例教程(Tutorials and Samples for direct3D9)此DX开发包提供弱干资源和例程代码。

Tutorials都是彻底从头重新编写的仅仅包含运行Direct3D 功能函数的必须应用程序接口(API)。

Samples都演示了Direct3D 9的最新特征和最基本的函数功能,所有的Direct3D样例都建立在DXUT之上。

Tutorials以下的Tutorials演示了Direct3D基本功能也仅仅是SDK里面所提供的。

Direct3D Tutorials这里的引导教程向你展示了如何在C/C++程序中使用Direct3D和D3DX。

这些工作分成为以下必要的几步:Tutorial 1: 创建设备(Creating a Device)Tutorial 2: 渲染顶点(Rendering vertices)Tutorial 3: 使用矩阵(Using Matrices)Tutorial 4: 创建和使用光照(Creating and using lights)Tutorial 5: 使用纹理贴图(Using Texture Maps)Tutorial 6: 使用网格(Using Meshes)这些教程的代码都是来自各个教程所提供的源工程中,代码程序都是用C++编写,如果你正在使用C编译器,那么你必须为它们做些合理的改变以便成功的编译程序,至少你需要把vtable和指针加入到这些接口函数有些例程中的注释可能和平台sdk源文件中的不同,这些改变仅仅为了更简洁,但并没有改变所要表达的意思。

Tutorial 1: (创建设备环境)Creating a Device为了使用Direct3D,第一步你创建一个应用程序窗口,然后创建和初始化Direct3D对象。

你使用组件对象模型接口(component object model(com) interfaces),这些对象执行渲染场景所必须的对象。

Manageddirectxforvb学习笔记一

Manageddirectxforvb学习笔记一

Managed directx for vb2005学习笔记(一)要使用Managed directx,需要先安装directxsdk august 2006。

其安装过程与其它程序没什么不同,所以在此就不多说了。

一、添加对Managed directx的引用。

新建一个窗体工程,打开“项目”菜单,单击添加引用。

,在.net选项卡下,找到microsoft.directx,以及microsoft.directx.direct3d 两项,选择 1.0.2902.0版本,添加引用。

如果要添加对microsoft.directx.direct3dx的引用,则要选择 1.0.2911.0版本,否则在绘制纹理时会出现错误。

然后在任何可能使用Managed directx的模块开头添加如下代码:Imports Microsoft.DirectXImports Microsoft.DirectX.Direct3D这样做的目的,是为了可以更方便的使用Managed directx中的对象组件。

二、创建一个设备device要使用Managed directx,创建device 是基础,一个device可以理解为你电脑上的一个显示设备。

1、首先看device的一个构造函数:Public Sub New( _ByVal adapter As Integer, _ByVal deviceType As DeviceType, _ByVal renderWindowHandle As IntPtr, _ByVal behaviorFlags As CreateFlags, _ByVal presentationParameters() As PresentParameters _)参数:Adapter 指定了你要用的视频卡的序号,当今电脑上可能不止一块视频卡,其可能的序号为0到视频卡总数-1,如果你的电脑只有一台显示器,或者你只想在主显示器上显示图形,酒可以采用默认序号(0)。

基于DirectShow视频及图片捕获软件的开发

基于DirectShow视频及图片捕获软件的开发

我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。

DirectShow为多媒体流的捕捉和回放提供了强有力的支持。

运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。

它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。

另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。

更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。

笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。

本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。

软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。

下面是软件的主界面。

预览视频后可以对视频格式和图像参数进行设置。

开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。

下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。

另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。

从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。

接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。

MFC中使用SDK个人经验总结(包含海康威视云台相机)

MFC中使用SDK个人经验总结(包含海康威视云台相机)

dlgdata.cpp Line 40 的问题首先打开C->PROGRAM FILE(X86)->Microsoft Visual Studio 11.0->VC->atlmfc->src->mfc->dlgdata.cpp打开,并在LINE40添加断点,调试找出nIDC的值,然后解决问题!如果在resource.h中找不到对应ID,又或者更改过resource.h,出现异常,应删除debug 文件夹,重新生成解决方案!!!重新生成!1.项目属性中“C/C++”->“常规”->“附加包含目录”添加SDK包中的头文件;2.项目属性中“链接器”->“常规”->“附加库目录”把对应的文件夹位置添加进去;3.项目属性中“链接器”->"输入"->“附加依赖项”添加相应的lib文件名。

4.在C***Dlg.h中添加头文件#include"GeneralDef.h"5.在C***App的初始化程序InitInstance()中添加SDK的初始化程序NET_DVR_Init();6.添加成员变量:播放句柄变量LONG m_lPlayHandle; 播放句柄用于判断是否播放正常以及作为NET_DVR_StopRealPlay等函数的句柄参数。

添加成员变量DWORD m_fault_code;BOOL m_bIsLogin;BOOL m_bIsPlaying;STRU_DEVICE_INFO m_struDeviceInfo;并在构造函数中对其初始化m_lPlayHandle = -1;m_fault_code = 0;m_bIsLogin = FALSE;m_bIsPlaying = FALSE;7.在C***Dlg.cpp中添加全局变量char DeviceIp[13] = "192.168.1.11";char UserName[6] = "admin";char Password[10] = "xde123456";WORD DeviceIpPort = 8000;8.单按钮启动if(!m_bIsLogin){NET_DVR_DEVICEINFO_V30 DeviceInfoTmp;memset(&DeviceInfoTmp,0,sizeof(NET_DVR_DEVICEINFO_V30));LONG lLoginID = NET_DVR_Login_V30(DeviceIp , DeviceIpPort, UserName, Password,&DeviceInfoTmp);if(lLoginID == -1){CString strTemp;strTemp.LoadStringW(IDS_STRING_0_LOGIN_STATUS);MessageBox(strTemp);return;}m_bIsLogin = TRUE;m_struDeviceInfo.lLoginID = lLoginID;m_struDeviceInfo.iDeviceChanNum = DeviceInfoTmp.byChanNum;m_struDeviceInfo.iIPChanNum = DeviceInfoTmp.byIPChanNum;m_struDeviceInfo.iStartChan = DeviceInfoTmp.byStartChan;m_struDeviceInfo.iIPStartChan = DeviceInfoTmp.byStartDChan;}if(!m_bIsPlaying){NET_DVR_PREVIEWINFO ClientInfo = {0};ClientInfo.lChannel = 1;//选择预览的窗口句柄ClientInfo.hPlayWnd = GetDlgItem(IDC_0_STATIC_CAMERA)->m_hWnd;m_lPlayHandle = NET_DVR_RealPlay_V40(m_struDeviceInfo.lLoginID, &ClientInfo, NULL, NULL);//预览播放成功返回非负数,失败返回-1if(m_lPlayHandle >= 0){m_bIsPlaying = TRUE;CString strTemp;strTemp.LoadStringW(IDS_STRING_0_PLAY_BUTTON_STATUS2);GetDlgItem(IDC_0_PLAY)->SetWindowText(strTemp);this->SetTimer(Timer_Camera_Connect_Detection, 1000, NULL);}else{CString strTemp1;strTemp1.LoadStringW(IDS_STRING_0_PLAY_STATUS);CString strTemp2;m_fault_code = NET_DVR_GetLastError();strTemp2.Format(L"%d", m_fault_code);CString strTemp3;strTemp3.LoadStringW(IDS_STRING_0_PLAY_FAULT_CODE);CString strTemp4;strTemp4 = strTemp1 + L", " + strTemp3 + strTemp2;MessageBox(strTemp4);return;}}else{m_bIsPlaying = FALSE;CString strTemp;strTemp.LoadStringW(IDS_STRING_0_PLAY_BUTTON_STATUS1);GetDlgItem(IDC_0_PLAY)->SetWindowText(strTemp);NET_DVR_StopRealPlay(m_lPlayHandle);m_lPlayHandle = -1;GetDlgItem(IDC_0_STATIC_CAMERA)->Invalidate();}云台控制1.添加一个基于CButton的CPTZButton类,2.在头文件中添加以下声明#if !defined(AFX_PTZBUTTON_H__B3E99438_BBCE_4862_845F_D3AB668824A6__INCLUDED_) #define AFX_PTZBUTTON_H__B3E99438_BBCE_4862_845F_D3AB668824A6__INCLUDED_#if_MSC_VER > 1000#pragma once#endif// _MSC_VER > 1000并在头文件的结尾加上#endif3.添加成员变量int m_iSubBtnIndex; //功能按钮的索引号,添加按钮类时自动+1,用于对应相应功能添加成员函数void PTZControlAll(LONG lRealHandle,DWORD dwPTZCommand,DWORD dwStop ,int Speed); //用于实现各按钮的功能4.添加全局变量int g_iPtzBtnIndex = 0;在构造函数中对m_iSubBtnIndex进行初始化m_iSubBtnIndex = g_iPtzBtnIndex++;5.通过类向导,添加消息处理函数OnLButtonDown和OnLButtonUp;6.在PTZButton.cpp中添加***app的头文件,并添加声明#ifdef_DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif7.在按钮所在画面的类中添加两个函数,用于获得预览窗口的句柄以及云台移动的速度。

(完整word版)传智播客C经典入门课堂笔记-苏坤

(完整word版)传智播客C经典入门课堂笔记-苏坤

今天学习的第一句话:Console.WriteLine(“你想显示的内容。

”);第二句话:Console.ReadKey();当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才会继续执行。

在C#中,每一句话都必须以“分号”结束C#中的注释,什么是注释呢?对我程序进行的解释,注释是给人看的。

下面的一对指示可以折叠代码。

#region内容#endregionMSIL:微软中间语言Microsoft Inter mediate LanguageCLR:公共语言运行时Common Language RuntimeCLS公共语言规范Common Language SpecificationCTS:通用类型系统Common Type SystemJIT:即时编译器Just In Time第二天课程:复习--Console.WriteLine()可以用CW加Tab键。

这样就能直接打出Console.WriteLine();变量1:变量:变量代表着一块内存空间,我们可以通过变量名称向内存存\取数据。

有变量就不需要我们记忆复杂的内存地址。

向内存申请一块内存空间的语法:数据类型变量名;整数在我们C#中的数据类型叫intInt nuber;Double:小数Char:字符型只能存储一个字符,并且存储的这个字符要求用单引号引起来String 类型:字符串,就是把0个或1个或多个字符连接起来。

字符串要求用双引号引起来。

Decimal 类型:用来表示钱和货币,失精度不至于丢失。

注意:在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型。

在一个小孩苏idan后面加个m\M,就告诉编译器这是个decimal类型应该写成:money = 100.34m;变量的命名规则:1.必须以“字母”_或@符号开头、2.后面可以跟任意“字母”,数字,下划线。

基于DirectShow的多摄像头视频采集

基于DirectShow的多摄像头视频采集

基于DirectShow的多摄像头视频采集1.为什么使用DirectShow笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoCapture类没有问题,但是双摄像头就有问题,一个正常,另外一个采集不到信息,显示一片灰色。

网上有种解决方法是逆序打开摄像头,结果两个窗口是可以采集到视频信息,但是竟然是同一个摄像头的视频信息,无奈的只能使用DirectShow采集多摄像头视频信息。

先看看什么是DirectShow:DirectShow 是 DirectX 的组件之一, DirectX 软件开发包是 Microsoft 提供的一套在 Windows平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。

这其中,DirectShow提供了应用程序从适当的硬件中捕捉和预览音、视频的能力。

数据源包括: VCR、 Camera、 TV Tuner、 Microphone 或其他的数据源。

应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。

摄像头采集信息常用的软件AMCap就是基于DirectShow SDK编写的。

查阅一下官方文档,感觉好难的样子,难道要新学一门“快过时”的技术吗?幸好于仕琪老师写了一个CCameraDS类,可直接返回IplImage,使用方便。

2.在VS2010中配置DirectShow并采集双目摄像头视频下载DirectShow相关文件,我已经共享在百度云盘,点击下载。

解压以后copy到D:\opencv里(放在这里为了管理方便)在解决资源管理器中的项目名称处右键\属性\配置属性\VC++目录,引用目录中添加DirectShow的include文件夹,我添加的是D:\opencv\DirectShow\Include在引用目录下面有一个库目录,添加DirectShow的Lib文件夹,我添加的是D:\opencv\DirectShow\Lib;下载CCameraDS类相关文件,点击下载。

directx从入门到精通(direct简介)

directx从入门到精通(direct简介)

返回总目录第一篇DirectX目录第一章 DirectX简介1.1 DOS已经过时1.2 加速DirectX1.3 加速计算机工业1.4 Directness原理1.5 Direct结构1.6 DirectX组件1.7 小结第二章基础2.1 期望什么2.2 COM(对象组件模型)入门2.3 编程经验 242.4 调试DirectX2.5 总结第三章开始使用DirectX3.1 安装3.2 文档3.3 例子程序源代码3.4 其他有用的信息3.5 使DirectX开始工作3.6 总结第一章 DirectX简介到目前为止,Microsoft Windows下的计算机游戏还没有一个辉煌的历史──它的成功还受到多媒体技术方面的限制。

Windows所提供的应用程序和PC平台之间的设备独立性使得游戏和多媒体开发者备受压力,这是因为设备独立性技术使得软件和硬件之间增添了许多中间层次,因此要想在Windows平台上生成平滑、快速的动画和紧凑、实时的输入和声音是非常困难的。

Windows的中心思想就是要把开发者和应用程序从硬件中分离出来,但这一点对于那些想直接操作硬件而获得最大速度的游戏开发者来说是致命的。

市场需要的是高性能的游戏,因此,对于那些想把Windows作为计算机游戏平台的推广者来说,“DOS!DOS!DOS!”是他们经常遇到的对DOS游戏的赞歌!1.1 DOS已经过时然而,MS-DOS也有它自已的问题,其中最棘手的是硬件设备的支持。

PC机的游戏开发者是不能享受到游戏机开发者的那种平台一致性的。

对于游戏机软件开发者,他们晚上可以睡得很香,因为白天所写的代码将在上百万台同样的机器上运行。

而PC机的开发者却不能这样,他们老是梦见新的图形协处理器、数字游戏杆、3D加速卡和实时的输入设备,他们自已也知道,在下一个游戏中将需要支持更多的硬件。

所有的PC游戏都要利用目前最好的硬件以获取最佳性能,这使得那些小游戏软件开发公司很难跟上硬件发展的步伐。

DirectX基础知识

DirectX基础知识

第三章D北方工业大学宋irectX简介学数媒系伟讲授内容启动Direct3D¾Direct3D工作原理¾Direct3D开发环境配置¾Direct3D初始化¾系统响应时间间隔绘制流水线代码封装3.1 启动D irect3DDirect 3D Direct 3D概述DirectX 是由微软开发的一套API ,是由微软开发的套Graphics(Direct3D + Direct Draw)、D Sound 、Direct Play 、Direct Setup 、D 程序员在编程的时候不用关电脑底程序员在编程的时候不用关心电脑底在后面的学习中我们将重点学习,这套API Direct这套包含了irect Input 、Direct Show 、Direct Direct Objects 等多个组件,它使底层硬件底层硬件。

习DirectX 的图形API Direct3D 。

3.1.1Direct3D 工作原其硬件加速功能来绘制3D 场景。

Direc秀的图形API—Direct3D 。

它是一套底层作为应用程序与图形设备交互的中介们能够利用当电脑上的件不支持HEL ,当电脑上的硬件不支持Direct3D 时,HEL 会通过软件运算来模拟硬件运硬件制造商提供HAL ,硬件制造商提供,提供了简单的口,Direct3D 可以通过它直接与图形硬心底层硬件的类型。

此外,利用HAL 提速功能,可以绘制出更高效和高质量原理ctX 提供了一套优层图形API ,被视,借助该API ,我D 的某些高级功能运算。

的设备驱动程序接硬件对话,无需关提供的图形硬件加的游戏场景。

下载并且安装DXSDK•网址: /DXSDK •下载最新版本的DXSDK./en ‐us/download/details.aspx?id=6811.基于路径设置的的D3D环境配置打开Vi l St di创建个空的①Visual Studio 2010创建一个空的中项目名,右键属性弹出项目配置i32的win32项目。

directshow教程(新整理)

directshow教程(新整理)

Directshow教程0.11MSDN翻译系列作者:黄丁杰说明:如果有任何问题请联系din-je@。

是本人业余翻译的如果有错误请直接发到我邮箱我会立刻改正,directshow的其他文章我会在以后不断翻译出来。

如果觉得好请帮我作作宣传。

欢迎转载,但是禁止修改。

Directshow起步。

本章主要介绍diirectshow在编写程序时所需的基本概念。

在本章你可以总揽下directshow 技术。

你必须在总体上对本章的编程和媒体有所了解。

本章将介绍。

设置编译环境。

介绍directshow应用程序编程。

如何播放一个文件设置编译环境:你可以编译工程在命令行模式下或者在vs集成环境中头文件所有的directshow应用程序都使用下面的头文件。

Dshow。

H部分directshow接口需要附加的头文件。

这些文件会在接口的注意中给出。

所需的库文件directshow需要如下的库文件strmiidl。

Lib 该库包含CLSIDs和IIDs的接口。

所有的directshow都需要该库。

Quartz。

Lib 该库包含AMGetErrorText函数。

如果你没有调用该函数,该库没有用。

记住在你的编译环境中必须把directx SDK 的头文件库和连接库的目录作为vs优先搜索的路径。

这样可以保证编译的时候用的是最新版本的文件。

介绍directshow应用程序编程本章介绍编写一个directshow程序的基本技术和概念,读完本章你就可以写个你自己的directshow的应用程序了。

滤镜和图像滤镜directshow是由被称作滤镜的东西构成的。

滤镜是一个软件包用来执行对多媒体流的一些操作。

比如directshow的滤镜可以读出一个文件从视频捕捉设备获取视频流解码各种各样的多媒体格式,比如MPEG-1S视频。

传输视频和音频到屏幕和声卡。

滤镜几乎完成视频播放所需要的从输入到输出的所有功能。

比如一个MPEG-1的滤镜。

它可以输入MPEG码流然后输出图像帧用于后续显示在directshow程序中只要执行把滤镜连接在一起就可以了。

DShow要点

DShow要点

DShow要点1. DirectShow介绍DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。

它支持多种多样的媒体文件格式,包括ASF、 MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。

DirectShow整合了其它的 DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。

DirectShow大大简化了媒体回放、格式转换和采集工作。

但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。

以下是几个使用DirectShow编写的典型应用:DVD播放器、视频编辑应用、AVI到ASF转换器、MP3播放器和数字视频采集应用。

DirectShow是建立在组件对象模型(COM)上的,因此当你编写DirectShow 应用时,你必须具备COM客户端程序编写的知识。

对于大部分的应用,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件,但是假如你需要编写自己的 DirectShow组件,你还需要具备编写COM组件的知识。

1.1. DirectShow支持的格式DirectShow是一个开放的框架,因此只要有合适的filter来分析和解码,它可以支持任何格式。

DirectShow默认支持以下的文件类型和压缩格式:注:打*号的需要Windows Media Format SDK支持文件类型:Windows Media? Audio (WMA)*Windows Media? Video (WMV)*Advanced Systems Format (ASF)*Motion Picture Experts Group (MPEG)Audio-Video Interleaved (AVI)QuickTime (version 2 and lower)WAVAIFFAUSNDMIDI压缩格式:Windows Media Video*ISO MPEG-4 video version 1.0*Microsoft MPEG-4 version 3*Sipro Labs ACELP*Windows Media Audio*MPEG Audio Layer-3 (MP3) (decompression only)Digital Video (DV)MPEG-1 (decompression only)MJPEGCinepak微软自己没有提供MPEG2解码器,一些可用的DirectShow MPEG2硬件或软件解码器是由第三方提供的。

directshow采集多媒体音视频同步

directshow采集多媒体音视频同步

随着计算机网络和多媒体技术的发展,多媒体应用如视频会议、远程监控、远程教育、可视电话、医疗视频会诊等迅速兴起,视频和音频捕获成为多媒体应用中的关键环节和重要前提。

目前采用较多的基于设备软件开发工具箱(SDK)的捕获方式存在成本较高、灵活性和扩展性较差等问题,难以满足用户需求和网络环境的变化。

微软公司推出的多媒体开发软件包———DirectShow成为解决这些问题的一个有力工具。

DirectShow提供高质量的多媒体数据流的捕获和回放功能,广泛支持多种媒体格式,包括ASF、MPEG、A VI、DV、MP3和W A V等。

同时DirectShow对VFW具有良好的兼容性,并具有其无法比拟的优势,包括支持大量多媒体数据捕获的同时可通过网络传播和播放,支持视频与音频在捕获和播放中的完全同步,支持来自不同媒体源数据捕获的合成等。

本文着重介绍如何利用Visual C++实现基于DirectShow的视频和音频捕获以及其中涉及到的关键问题,以供工程人员和开发人员参考使用。

DirectShow的原理1、DirectShow的体系结构。

应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示。

DirectShow使用模块化的架构,系统中的基础模块称为过滤器(Filter)。

过滤器作为软件的组件,可完成单一的数据流处理功能。

按照功能,过滤器大致分为3类:源过滤器(Source Filter)、转换过滤器(Transform Filter)和表现过滤器(Rendering Filter)。

源过滤器负责从媒体源获取数据;转换过滤器负责数据的格式转换、传输,如数据流分离/合成、编码/解码等;表现过滤器负责数据的最终去向,将数据送往显卡和声卡进行播放,或输出到文件进行存储。

过滤器之间通过引脚(Pin)进行有序连接,组合而成过滤器图(Filter Graph),用以实现组合的一系列功能。

应用程序创建过滤器图管理器(Filter Graph Manager),负责过滤器图的组织和连接功能并控制数据在其中的流动。

DirectShow的接口去初始化和访问系统的硬件设备

DirectShow的接口去初始化和访问系统的硬件设备

DirectShow的中文资料之设备列举和捕捉接口这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。

代表性的,DirectShow应用程序使用下面类型的硬件。

音/视频捕捉卡音频或视频回放卡音频或视频压缩或解压卡(象MPEG解码器)下面将以AV设备作参考。

如何列举设备包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。

因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。

你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。

DirectShow自动为win32和Video for Windows 设备实例化过滤器。

要AV设备工作,首先,你必须检测当前系统存在的设备。

ICreateDevEnum接口建立指定类型的列表。

提供你需要的检测和设置硬件的功能。

访问一个指定的设备有三步,详细的说明和代码如下:建立系统硬件设备的列表首先,申明一个列表指针,然后通过CoCreateInstance 建立。

CLSID_SystemDeviceEnum 是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。

ICreateDevEnum *pCreateDevEnum ;CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。

你就可以使用他访问新得到的列表了。

IEnumMoniker *pEnumMon ;pCreateDevEnum->CreateClassEnumerator( [specify device GUID here], &pEnumMon, 0);最后,列举列表直到你得到你想要的设备为止。

directx教程

directx教程

directx教程DirectX是一个由微软开发的跨语言、跨平台的多媒体框架。

它提供了一组应用程序接口(API),用于处理游戏、音频和视频等多媒体内容的开发。

DirectX包含了多个组件,其中最常用的就是Direct3D、DirectSound和DirectInput。

Direct3D是DirectX中最重要的组件之一,它是用于游戏和图形应用程序的3D渲染API。

通过Direct3D,开发者可以利用硬件加速来呈现逼真的3D图形。

Direct3D提供了一系列的命令和函数,用于创建、操作和呈现3D场景。

它支持灯光、纹理、变换等常用的3D特性,同时还提供了高级功能,如像素着色器和顶点着色器,用于实现更高级别的渲染效果。

DirectSound是用于处理音频的组件,它提供了一系列的函数和工具,开发者可以用它来播放、录制和处理音频数据。

DirectSound支持多个音频设备、3D音效等高级功能,可以实现更加真实和生动的音频体验。

DirectInput是用于处理输入设备的组件,它提供了一系列的函数和工具,开发者可以用它来处理鼠标、键盘、游戏手柄等输入设备的输入。

通过DirectInput,开发者可以轻松地获取用户的输入数据,并进行相应的处理。

由于DirectX是跨语言、跨平台的框架,所以可以在多种操作系统上使用。

目前,DirectX主要支持Windows操作系统,但微软还推出了一些用于其他平台的版本,如DirectX for Xbox 和DirectX for Windows Phone等。

为了学习和使用DirectX,开发者通常需要了解一些基本的图形学和数学知识。

对于初学者来说,官方提供的文档和教程是最好的学习资源。

在开始学习之前,建议开发者对计算机图形学和3D数学有一定的了解,这样才能更好地理解和运用DirectX。

学习DirectX的过程中,开发者可以从简单的示例和小项目开始,逐渐深入理解和掌握各个组件的功能和用法。

编程入门:DirectX 9.0 学习笔记

编程入门:DirectX 9.0 学习笔记

【简介】DirectX(简称:DX)是微软推出的一套基于Windows系统的多媒体应用程式接口APIs函式。

在开发中,DX分为两个部分,一个是运行库,通过DX编译出来的程式必须要有运行库的支持,另外一个是开发库,也就是常说的SDK,这部分是在编译DX程序中是必需的。

3、DirectX 9.0 家族的所有成员DirectX Graphics:集成了以前的DirectDraw 和Direct3D技术。

DirectDraw主要负责2D加速,以实现对显卡内存和系统内存的直接操作;Direct3D主要提供三维绘图硬件接口,它是开发三维DirectX 游戏的基础。

DirectInput:主要支持输入服务(包括鼠标、键盘、游戏杆等),同时支持输出设备。

DirectPlay:主要提供多人网络游戏的通信、组织功能。

DirectSetup:主要提供自动安装DirectX组件的API功能。

DirectMusic:主要支持MIDI音乐合成和播放功能。

DirectSound:主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等功能。

DirectShow:为Windows平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。

DirectX Media Objects:DirectShow Filter 的简化模型,提供更方便的流数据处理方案。

4、DirectShow的由来DirectShow是从DirectX6.0中的DirectX Media 发展而来的,它集成了DirectX家族中其他成员(DirectDraw、DirectSound等)的技术。

DirectX Media Objects是从DirectX8.1的DirectShow中分离出来的,成为了另一种高效率的流数据处理解决方案。

5、程序开发包的选择请问在Mirosoft DirectX主页上的下载连接有如下:它们有什么区别:DirectX 9.0 SDK Update - (April 2005)DirectX 9.0 SDK Update - (April 2005) Symbol FilesDirectX 9.0c Redistributable for Software Developers - (April 2005) DirectX 9.0c End-User Runtime--------------------------------------------------------------------------------DirectX 9.0 SDK Update - (April 2005) - 就是通常说的DXSDKDirectX 9.0 SDK Update - (April 2005) Symbol Files -调试时用的符号文件DirectX 9.0c Redistributable for Software Developers - (April 2005) -能够随你的程序一起发行的部分DirectX 9.0c End-User Runtime -普通用户安装的DXDX编程开发技巧6、如何把DirectX关联到VC中?我们要进行DirectX程序的编译就必须要有DirectX SDK库文件,此文件可以到微软或者本站获取,然后通过VC设置将其关联。

多媒体技术之DirectX编程入门

多媒体技术之DirectX编程入门

第13章 DirectX编程入门DirectX是微软公司为编写游戏和其他高性能多媒体应用程序而开发的一组高级的Windows低层API,它包含了对图(图形、视频和三维动画)、声音(声效与音乐)、输入设备和网络游戏等的支持。

本章先概述DirectX的基本内容,然后介绍DirectX的主要组件Direct3D和DirectSound的基本编程方法,并给出若干具体编程实例。

13.1 DirectX概述本节简单介绍DurectX的发展历史、版本和功能的演化、结构和模块划分。

DurectX是Windows的一种多媒体API,它在保持设备无关性的同时,可以让应用程序直接控制多媒体设备,从而能充分利用硬件的功能,因此可获得最高的性能。

DurectX自从推出以来,就始终处在快速发展的过程之中。

它已经经历了多个版本,其模块和功能也一直在不断地增加和完善。

DirectX是一种基于COM的系统,主要由硬件抽象层HAL和硬件模拟层HEL所构成。

DurectX被分成若干个组件模块,涵盖了多媒体应用的方方面面。

而且这些组件的数目、名称和功能,也是随着其版本的演化而有所增减、改变和加强。

13.1.1 历史微软公司于1990年5月推出的Windows 3.0大获成功,它是一种与设备无关的具有图形用户界面(GUI)的操作系统。

后来又于1992年3月推出Windows 3.1,提供了对多媒体的支持。

不过Windows的与设备无关的设计思想,虽然使得Windows向程序员提供了一个独立于硬件的软件开发优秀平台,但它不让应用程序直接操作显卡和声卡等多媒体硬件,这样就降低了多媒体应用程序(特别是计算机游戏)的运行效率,例如限制了动画的帧率、不提供混音功能等。

所以当时的Windows并不是一个可以开发和运行高效多媒体程序(如3D游戏)的理想环境,逼迫PC游戏开发商只好绕开Windows而仍旧开发DOS下的游戏。

为了改变这种难堪的局面,促使游戏界放弃DOS而使用Windows,微软需要在设备无关性与高性能之间取得某种平衡,决定为Windows添加一种高性能的动画机制(以及后来的输入与音响等),因此于1995年推出了Game SDK,后来改名为DirectX。

VS2010 C 学习(5):基于DirectShow视频预览录像程序

VS2010 C  学习(5):基于DirectShow视频预览录像程序

VS2010 C++学习(5):基于DirectShow的视频预览录像程序学习VC++编制的基于DirectShow视频捕获程序,主要练习基于DirectShow程序的应用。

一、主要内容:1.基于DirectShow视频预览;2.基于DirectShow视频录像;二、设计实现:(一)、安装DirectShow首先我们安装DirectShow SDK,由于现在directShow没有和direcxtx一起发布,而是和windows sdk 打包发布了,可以到官网下载最新的windows sdk 开发包。

一个可用的下载地址为/07/hh/DXSDK_Feb10.rar 然后安装好windows SDK。

安装完DirectShow SDK的目录为C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow。

(二)、开发环境配置开发环境的配置主要有两个工作要做:一是在使用Directshow SDK开发自己的程序时需要的DirectShow的有关静态库的配置,二是visual C++开发环境的配置。

1)生成DirectShow SDK开发库使用DirectShow SDK开发用户自己的程序需要几个静态链接库:quartz.lib、strmbasd.lib、STRMBASE.lib和strmiids.lib。

中间两个lib需要用户自己编译生成,而其他两个微软已经提供。

下表列出了使用DirectShow SDK开发程序所有要使用的库。

2)更改添加的include内容:C:\Program Files\MicrosoftSDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses;C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;添加过程如下。

DirectShow重要接口

DirectShow重要接口

DirectShow重要接口第一篇:DirectShow重要接口DirectShow重要接口DirectShow 的重要接口DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。

下面就列举一些重要的DirectShow的接口。

(1)IGraphBuilder接口用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。

(2)IMediaControl接口用于控制多媒体流在过滤器图表中的流动,如流的启动和停止。

(3)IMediaEvent接口用于捕获播放过程中发生的事件,并通知应用程序,如EC_COMPLETE等。

(4)IVideoWindow接口用于控制视频窗口的属性。

(5)IMeadiaSeeking接口用于查找媒体的接口,定位流媒体,控制多媒体数据播放提供精确控制。

(6)IBaseFilter接口从ImediaFilter接口继承,用来定义一个具体的过滤器指针,并对多媒体数据进行处理。

(7)IPin接口用于管理两个过滤器之间的Pin,从而连接过滤器。

(8)IsampleGrabberCB接口是Sample Grabber过滤器的一个接口,用于当流媒体数据通过过滤器时进行采样以获得帧图象。

用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM 格式的,当然,一些比较老的驱动格式DirectShow也可支持。

在DirectShow中,有一个Sample Grabber过滤器,它是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。

我们就可以用它来从一个视频文件中简单的扑获一桢。

DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。

DirectShow通过捕获过滤器(Capture Filter)来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。

DirectShow开发指南——学习笔记

DirectShow开发指南——学习笔记

第一部分DirectShow基础知识第1章系统概述1.1DirectX 大家族1.DirectX软件开发包是微软公司提供的一套在Wdinows操作平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。

2.DirectShow是DirectX中的一位集大成者。

1.2DirectShow简介一、DirectShow系统1.图中最大的一块是DriectShow系统,虚线以下是Ring0特权级别的硬件设备,虚线以上是Ring3特权级别的应用层。

DirectShow位于应用层中。

2.它使用一种叫作Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫作Filter;各个Filter在Filter Graph中按一定的顺序连接成一条流水线协同工作。

3.Filter大致分为3类:(1)Source Filters 负责获取数据,文件源可以是文件等,然后将数据往下传输。

(2)Transform Filters负责数据的格式转换,将数据继续往下传输。

(3)Rendering Filters负责数据的最终去向,将数据送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。

二、播放第一个媒体文件问题。

本身是一种规范,而不是实现。

当使用C++实现时,COM组件就是一个C++类,而接口就是纯虚类。

规范规定,任何组件或接口都必须从IUnknown接口中继承而来。

IUnknown定义了3个重要函数:(1)QueryInterface负责组件对象上的接口查询(2)AddRef增加引用计数(3)Release用于减少引用计数组件实际上是一个C++类,对于组件的外部使用者来说,这个类名一般不可知。

COM规范规定,每个组件都必须实现一个与之相对应的类工作Class Factory。

类工厂也是一个COM组件,它实现了IClassFactory接口。

在IClassFactory接口函数CreateInstance中,才能使用new操作生成一个COM组件实例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
2视频捕捉的设备
现在许多新的视频捕捉设备都采用的是WDM驱动方法,在WDM机制中,微软提供了一个独立于硬件设备的驱动,称为类驱动程序。驱动程序的供应商提供的驱动程序称为minidrivers。Minidrivers提供了直接和硬件打交道的函数,在这些函数中调用了类驱动。
在directshow的filter图表中,任何一个WDM捕捉设备都是做为一个WDM Video Capture
*ppBuild = pBuild;
*ppGraph = pGraph; // The caller must release both interfaces.
return S_OK;
}
else
{
pBuild->elease();
}
}
return hr; // Failed
预览pin和捕捉pin
视频捕捉Filter都提供了预览和捕捉的输出pin,预览pin用来将视频流在屏幕上显示,捕捉pin用来将视频流写入文件。
预览pin和输出pin有下面的区别:
1 为了保证捕捉pin对视频桢流量,预览pin必要的时候可以停止。
2 经过捕捉pin的视频桢都有时间戳,但是预览pin的视频流没有时间戳。
音频采集卡(声卡)。声卡的采集功能也是通过包装Filter来实现的;而且现在的声卡大部分都有混音的功能。这个Filter一般有几个Input pin,每个pin都代表一个输入,如Line In、Microphone、CD、MIDI等。值得注意的是,这些pin代表的是声卡上的物理输入端子,在Filter Graph中是永远不会连接到其他Filter上的。声卡的输出功能,可以有两个Filter供选择:DirectSound Renderer Filter和Audio Renderer (WaveOut) Filter。注意,这两个Filter不是上述意义上的包装Filter,它们能够同硬件交互,是因为它们使用了API函数:前者使用了DirectSound API,后者使用了waveOut API。这两个Filter的区别,还在于后者输出音频的同时不支持混音。(顺便说明一下,Video Renderer Filter能够访问显卡,也是因为使用了GDI、DirectDraw或Direct3D API。)如果你的机器上有声卡的话,你可以通过GraphEdit,在Audio Capture Sources目录下看到这个声卡的包装Filter。
下面,我们分别来看一下几种常见的硬件。
VfW视频采集卡。这类硬件在市场上已经处于一种淘汰的趋势;新生产的视频采集卡一般采用WDM驱动模型。但是,DirectShow为了保持向后兼容,还是专门提供了一个包装Filter支持这种硬件。和其他硬件的包装Filter一样,这种包装Filter的创建不是像普通Filter一样使用CoCreateInstance,而要通过系统枚举,然后BindToObject。
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pGraph);
if (SUCCEEDED(hr))
{
// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
捕捉Filter一般都有两个或多个输出pin,他们输出的媒体类型都一样,比如预览pin和捕捉pin,因此根据媒体类型就不能很好的区别这些pin。此时就要根据pin的功能来区别每个pin了,每个pin都有一个GUID,称为pin的种类。
如果想仔细的了解pin的种类,请看后面的相关内容Working with Pin Categories。对于大多数的应用来说,ICaptureGraphBuilder2提供了一些函数可以自动确定pin的种类。
过滤器(Filter)出现。WDM Video Capture过滤器根据驱动程序的特征构建自己的filter
下面是陆其明的一篇有关于dshow和硬件的文章,可以拿来参考一下
//陆文章开始
大家知道,为了提高系统的稳定性,Windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。DirectShow Filter工作在用户模式(User mode,操作系统特权级别为Ring 3),而硬件工作在内核模式(Kernel mode,操作系统特权级别为Ring 0),那么它们之间怎么协同工作呢?
首先创建一个Capture Graph Builder对象和一个graph manger对象,然后用filter graph manager 作参数,调用ICaptureGraphBuilder2::SetFiltergraph来初始化Capture Graph Builder。看下面的代码把
HRESULT InitCaptureGraphBuilder(
预览pin的视频流之所以没有时间戳的原因在于filter图表管理器在视频流里加一个很小的latency,如果捕捉时间被认为就是render时间的话,视频renderFilter就认为视频流有一个小小的延迟,如果此时render filter试图连续播放的时候,就会丢桢。去掉时间戳就保证了视频桢来了就可以播放,不用等待,也不丢桢。
图1
从上图中,我们可以看出,Ksproxy.ax、Kstune.ax、Ksxbar.ax这些包装Filter跟其它普通的DirectShow Filter处于同一个级别,可以协同工作;用户模式下的Filter通过Stream Class控制硬件的驱动程序minidriver(由硬件厂商提供的实现对硬件控制功能的DLL);Stream Class和minidriver一起向上层提供系统底层级别的服务。值得注意的是,这里的Stream Class是一种驱动模型,它负责调用硬件的minidriver;另外,Stream Class的功能还在于协调minidriver之间的工作,使得一些数据可以直接在Kernel mode下从一个硬件传输到另一个硬件(或同一个硬件上的不同功能模块),提高了系统的工作效率。(更多的关于底层驱动程序的细节,请读者参阅Windows DDK。)
讲到这里,我想大家应该对DirectShow对硬件的支持问题有了一个总体的认识。对于应用程序开发人员来说,这方面的内容不用研究得太透,而只需作为背景知识了解一下就好了。其实,大量繁琐的工作DirectShow已经帮我们做好了。
//陆其明文章结束
Direcshow中视频捕捉的Filter
Pin的种类
}
IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuild = NULL;
// Create the Capture Graph Builder.
HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
WDM驱动的硬件(包括视频捕捉卡、硬件解压卡等)。这类硬件都使用Ksproxy.ax这个包装Filter。Ksproxy.ax实现了很多功能,所以有“瑞士军刀”的美誉;它还被称作为“变色龙Filter”,因为该Filter上定义了统一的接口,而接口的实现因具体的硬件驱动程序而异。在Filter Graph中,Ksproxy Filter显示的名字为硬件的Friendly name(一般在驱动程序的.inf文件中定义)。我们可以通过GraphEdit,在WDM Streaming开头的目录中找到本机系统中安装的WDM硬件。因为KsProxy.ax能够代表各种WDM的音视频设备,所以这个包装Filter的工作流程有点复杂。这个Filter不会预先知道要代表哪种类型的设备,它必须首先访问驱动程序的属性集,然后动态配置Filter上应该实现的接口。当Ksproxy Filter上的接口方法被应用程序或其他Filter调用时,它会将调用方法以及参数传递给驱动程序,由驱动程序最终完成指定功能。除此以外,WDM硬件还支持内核流(Kernel Streaming),即内核模式下的数据传输,而无需经过到用户模式的转换。因为内核模式与用户模式之间的相互转换,需要花费很大的计算量。如果使用内核流,不仅可以避免大量的计算,还避免了内核数据与主机内存之间的拷贝过程。在这种情况下,用户模式的Filter Graph中,即使pin之间是连接的,也不会有实际的数据流动。典型的情况,如带有Video Port Pin的视频捕捉卡,Preview时显示的图像就是在内核模式下直接传送到显卡的显存的。所以,你也休想在VP Pin后面截获数据流。
5将设备从系统中移走时的事件通知(Device remove Notify)
6如何控制Capture Graph(Controlling Capture Graph)
7如何配置一个视频捕捉设备
8从静止图像pin中捕捉图片
1关于视频捕捉(About Video Capture in Dshow)
DirectShow解决的方法是,为这些硬件设计包装Filter;这种Filter能够工作在用户模式下,外观、控制方法跟普通Filter一样,而包装Filter内部完成与硬件驱动程序的交互。这样的设计,使得编写DirectShow应用程序的开发人员,从为支持硬件而需做出的特殊处理中解脱出来。DirectShow已经集成的包装Filter,包括Audio Capture Filter(qcap.dll)、VfW Capture Filter(qcap.dll,Filter的Class Id为CLSID_VfwCapture)、TV Tuner Filter(KSTVTune.ax,Filter的Class Id为CLSID_CTVTunerFilter)、Analog Video Crossbar Filter(ksxbar.ax)、TV Audio Filter(Filter的Class Id为CLSID_TVAudioFilter)等;另外,DirectShow为采用WDM驱动程序的硬件设计了KsProxy Filter(Ksproxy.ax,)。我们来看一下结构图:
相关文档
最新文档