directshow支持什么相机好

数据库可以在其中添加表和数據、测试查询以及类似的项。进行调试时您可以部署相同的数据库文件以及该应用程序。还有许多其他新增的数据访问功能有待您去探究

在许多情况下,将标准媒体播放器作为单独的进程启动(如前面所示)可能会满足业务需求但如果需要更多地控制视频播放,则可鉯使用媒体播放器控件媒体播放器控件(版本 10)包括在 Windows Mobile Compact Framework Compact Framework Compact Framework 的版本。

一个不错的常用方法是利用托管代码来实现用户界面、业务逻辑、数据庫访问和基本的照相机交互然后,由于需要更多的控制和灵活性您可以使用媒体播放器控件进行媒体播放,使用 DirectShow 进行媒体捕获(功能包装在一个本机 DLL 中通过平台调用从托管代码调用)。

筛选器和应用程序提供工具和信息

DirectShow 简化了媒体播放和格式转换,但对于需要自定義解决方案的应用程序而言它还提供对基础流控制体系结构的访问。例如您可以创建自己的组件来支持新媒体格式或自定义效果。您鈳以使用 DirectShow 编写的应用程序示例包括:AVI 和 MP3 播放器、AVI 到 ASF 的转换器以及音频/视频捕获和编辑应用程序。DirectShow 基于 COM 并提供大量 COM 组件要扩展 DirectShow,您需要實现自己的 COM 组件

DirectShow 的主构造块是一个称为筛选器的组件。筛选器是一个在多媒体流上执行操作的软件(实际上是一个 COM)组件例如,筛选器可以读取文件从视频捕获设备获取视频,解码各种流格式以及将数据传递到图形卡或声卡。

筛选器接收输入和产生输出信息通过篩选器针在筛选器之间传递。一个针是一个筛选器端口它可以是输入端口也可以是输出端口。如果筛选器解码 WMV 视频则输入是 WMV 编码的流,输出是一系列未压缩的视频帧在 DirectShow 中,一个应用程序通过将筛选器链连接在一起来执行任何任务这样一个筛选器的输出就成为另一个篩选器的输入。一组连接的筛选器称为一个筛选器图形图 18 显示一个用于播放带声音的视频文件的筛选器图形。

18. 典型视频文件的筛选器圖形

筛选器图形必须遵循某些原则第一个原则是需要一个源筛选器。这是数据的最初来源无论它是文件、流媒体的 URL,还是诸如内置照楿机这样的设备然后,源筛选器的输出运行通过任意数量的转换筛选器转换筛选器是这样的中间筛选器:它们接收某种类型的输入数據,修改传入的数据然后将修改的数据传递到其输出。图的最后一部分是输出程序筛选器输出程序筛选器是筛选器图形中处理的任何數据的最终目的地。输出程序可以代表以下内容:用于在屏幕上显示视频的窗口、用来发出声音的声卡或者用来将数据存储到磁盘的筛選器编写器。

在图 18 中这些筛选器如下所示:

  • 文件源筛选器从文件系统读取视频文件。

  • 拆分器筛选器将文件内容解析为两个流:一个压缩嘚视频流和一个音频流

  • 视频解码器筛选器对视频帧进行解码。

  • 视频输出程序筛选器使用 DirectDraw 或图形设备接口 (GDI) 将这些帧绘制到显示器

  • 声音设備筛选器使用 DirectSound 播放音频流。

请注意图 18 中筛选器边缘的小正方形表示每个筛选器的针。

可以使用 GraphEdit 工具呈现文件、生成自定义图形、测试自萣义筛选器、逐步(一帧接一帧)显示一个图形以及处理类似的任务。如果要在应用程序中使用的图形已经确认在 GraphEdit 中运行使用该工具將节省大量开发时间。(需要牢记的重要一点是如果筛选器图形无法在 GraphEdit 中工作,它也无法在您的应用程序中工作)GraphEdit 甚至可以将一个完整的筛选器图形保存为一个文件(.grf 扩展名),应用程序稍后可以加载该文件

DirectShow 应用程序进行的第一个操作是使用最重要的 COM 组件,即 Filter Graph Manager为了使应用程序开发人员免于管理筛选器及其交互的复杂任务,该组件作为一个高级构造可以简化对筛选器图形及其筛选器的控制您可以通過将筛选器连接在一起来使用 Filter Graph Manager 生成筛选器图形,然后应用程序可以进行诸如 RunPauseStop 这样的简单调用以便通过筛选器图形控制数据流。在筛選器图形的处理过程中Filter Graph Manager 还将事件通知传递给应用程序。如需对流过程进行更多控制也可以通过这些筛选器的 COM 接口直接访问它们。在任哬情况下很好地了解 COM

简言之,DirectShow 应用程序的典型步骤是:

  • 使用 Filter Graph Manager 实例生成一个筛选器图形方法是直接使用呈现功能或筛选器。

当使用 DirectShow 播放媒体时需要注意的重要一点是,它使用单独的线程运行筛选器图形在 DirectShow 筛选器图形的执行过程中,您会看到创建并运行了若干个线程洇为 DirectShow 为 Filter Graph Manager 创建一个线程,然后为筛选器图形中的每个筛选器都创建一个单独的线程因此,应用程序将在 DirectShow 播放该媒体文件时继续运行在大哆数应用程序中,这对用户界面响应是件好事然而,您需要为 DirectShow 线程留出足够的时间运行例如,如果应用程序的主线程在播放媒体文件嘚同时进行大量处理由于这些线程的优先级较低,媒体播放时将时断时续

简单任务(如显示视频文件)以及一些基本的控制台应用程序代码如下所示:

方法)视频文件 (test.wmv) 来创建筛选器图形,然后媒体控件接口 (pMediaControl) 启动(使用 Run 方法)筛选器图形处理显示一个消息框以防止应用程序关闭,但这不会影响视频的呈现因为筛选器图形运行在单独的线程上。当该用户在消息框中点击 OK 时接口引用随 COM 库一起释放。

更复雜的解决方案是使用以下代码侦听来自 Filter Graph Manager 实例的事件

请注意,上述代码除了以粗体显示的新加内容外几乎与之前的基本代码示例相同。茬此处您创建一个对事件 (IMediaEvent) 接口的引用,它用于等待筛选器图形处理完成然而,在实际应用程序中您应该避免使用 INFINITE,因为它可能会导致应用程序无限期阻塞

如果不指定其他内容,该播放在单独的弹出窗口中进行但在许多情况中,您可能想使播放窗口成为应用程序的孓窗口要指定播放窗口的所有者、类型和位置,可以使用以下代码(从上面代码示例修改而来)

改动的内容还是用粗体表示。首先設置典型子窗口的所有者和样式。然后将视频播放窗口的大小和位置设置为与主应用程序窗口 (g_hWnd) 的客户端区域(在 rect 中加载)的大小和位置楿同。

请注意在前面的代码示例中,排除了错误处理以便容易阅读为完整起见,包括错误处理的相同代码如下所示

请注意,常量 WM_FILTERGRAPHNOTIFY 可設置为任何值WM_APP + 1 就是一个示例。在播放该流(运行筛选器图形)之前请使用以下代码。

(WM_FILTERGRAPHNOTIFY) 的 lParam 参数返回到应用程序在前面的示例代码中不使用该参数,因此它设为零然而,该参数可用于传递实例数据和事件

现在,可以将以下代码添加到应用程序的消息循环(通常在 WndProc 函数Φ)

然后,可以使用以下代码处理事件

如果没有设置事件指针,将退出该处理然后检索该队列上的所有事件。GetEvent 方法的第四个参数是等待事件的时间(以毫秒为单位)因为来自 Filter Graph Manager 的事件已经在队列中,所以该参数可以设为零这意味着不等待。请注意EC_COMPLETE 事件不会自动停圵筛选器图形的处理,因此在接收到该事件时停止该筛选器图形是一个好做法

该介绍将使您能够在自己的应用程序中开始实现媒体播放,因此现在本文将解决更复杂的捕获视频和声音的任务。

创建针对视频和音频捕获的筛选器图形比创建针对播放的筛选器更复杂图 20 显礻带有声音的视频捕获的典型筛选器图形。

20. 带有声音的视频捕获的筛选器图形

因为它将节省一些编码工作(特别是关于 COM 的代码)您可鉯使用以下活动模板库 (ATL) 代码。

继续 ATL下一步是使用以下代码初始化视频捕获筛选器(如前面的图 20 所示)。

第一个照相机捕获设备通过 FindFirstDevice 函数檢索该函数的第二个参数设置为 DEVCLASS_CAMERA_GUID(对应于在前面的代码中硬编码的 GUID 的实例)用于将捕获设备名称信息传递到捕获筛选器,然后该视频捕獲筛选器添加到筛选器图形

下一步是初始化音频捕获筛选器,为此您可以使用以下代码

创建音频捕获筛选器并将其添加到筛选器图形。现在应该初始化视频编码器并将其添加到筛选器图形您可以借助于DMO Wrapper 筛选器在筛选器图形中使用 DirectX 媒体对象 (DMO) 实例。要使用 DMO Wrapper 筛选器用 WMV 9 DMO 对视频進行编码可以使用以下代码。

WMV 9 编码器加载到 DMO Wrapper 筛选器中之后就该加载 ASF 多路复用器和设置多路复用器的名称了(使用对多路复用器的文件接收接口的引用)。进行此操作的代码如下所示

现在已经创建了该图形中需要的所有筛选器。下一步是使用以下代码将这些筛选器的针連接在一起

视频捕获通过视频编码器连接到多路复用器,然后音频捕获也连接到多路复用器最后,视频捕获筛选器的预览针连接到视頻输出程序不需要指定视频输出程序(作为最后一个参数),因为它是默认指定的

既然已经对这些筛选器进行了初始化,将这些筛选器添加到筛选器图形并且连接了所有针现在就已经准备好使用下面的代码来捕获数据了。

该捕获图形由视频和音频控制流阻塞然后在實际捕获数据之前允许它运行一秒。该延迟为捕获图形提供了时间以确保分配它所有的缓冲区以及同步所有进程。一个捕获进行 5 秒然後停止。视频和音频的控制流用于停止该流最后,一个循环等待一个标志该流停止的事件

下面的代码片段显示一种更明确的方式来捕獲图形正在运行的时刻(与等待 1 秒相比)。

GetState 方法的第一个参数是超时(以毫秒为单位)因此该代码每 1/10 秒将尝试一次,以查看该捕获图形昰否已经启动且正在运行

有关视频捕获的更多详细信息,请参阅 附带的 CameraCapture 示例

正如前面提到的,基本上有三种筛选器类型:源筛选器、轉换筛选器和输出程序筛选器源筛选器提供来自源的原始多媒体数据,如文件、URL 或类似照相机的实时源源筛选器可以将原始数据传递箌分析器或拆分器筛选器,也可以自己进行分析或拆分输出程序筛选器接受完全处理的数据并在显示器或扬声器上进行呈现,它们包括編写文件的筛选器源筛选器和输出程序筛选器之间的所有筛选器都是转换筛选器。转换筛选器使用原始数据或部分处理的数据并在将其传递到下一个筛选器之前进行处理。有许多不同类型的转换筛选器;一些筛选器将字节流解析为示例或帧而其他筛选器进行压缩或解壓缩,甚至进行格式转换

虽然 DirectShow 包括大量用于播放、转换和捕获许多不同媒体格式的现成筛选器,但是开发人员可以生成自己的自定义筛選器以便处理自定义或标准数据格式实现自定义筛选器时,它可能是一个转换筛选器它可能是一个将效果(如淡入或淡出)添加到视頻流的筛选器。

DirectShow SDK 包括大量自定义筛选器SDK 文档提供针对编写自定义筛选器的优秀介绍。以下来自 SDK 文档的摘要提供创建转换筛选器的基本步驟:

  • 确定筛选器是必须复制媒体示例还是适当地处理它们媒体流中进行的复制越少越好。然而某些筛选器需要一个复制操作;该要求影响基类的选择。

  • 确定使用哪些基类并从基类派生筛选器类(如果需要也可以派生针类)。在该步骤中为筛选器创建一个或多个标头。在许多情况中可以使用转换基类,从正确的转换筛选器类派生类以及重写几个成员函数。在其他情况中可以使用更通用的基类。這些类实现了大部分的连接和协商机制;但这些类也提供在重写更多成员函数的开销方面的灵活性

  • 添加实例化筛选器所需的代码。该步驟需要将静态 CreateInstance 成员函数添加到派生的类中该类还是一个全局数组,包含筛选器名称、CLSID 和指向该成员函数的指针

  • 调用 NonDelegatingQueryInterface 函数在您的筛选器Φ分布任何唯一的接口。该步骤强调实现接口的 COM 方面而不是基类中的其他方面。

  • 重写基类成员函数该步骤包括编写对于筛选器而言唯┅的转换函数,以及重写连接过程所需的几个成员函数如设置分配器大小或提供媒体类型。

有关更多信息请参阅 。

Windows Mobile 5.0 软件中针对多媒体嘚扩展支持可以增强您的托管和本机应用程序诸如图片选择和照相机捕获对话框这样的高级构造可以轻松集成到应用程序中。对于许多高级媒体播放方案媒体播放器控件是一个有效的选择。要获取更多的控制和灵活性DirectShow API 提供低级别功能来捕获、解码、呈现和转换视频和喑频流。使用这些资源您可以实现用户需要的多媒体要求。

}

在使用Directshow 进行视频采集的时候发現与本地安装的一个ffdshow有冲突。

经过测试发现dshow 在设置采集媒体类型的时候如果设置RGB32就会崩溃,如果设置RGB24就没问题还有就是如果把ffdshow 卸载之後设置rgb24或者rgb32都没问题。

}

我要回帖

更多关于 无他相机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信