首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows音视频采集软件范式

Windows音视频采集软件范式
EN

Stack Overflow用户
提问于 2014-10-07 04:42:43
回答 2查看 519关注 0票数 0

我正在编写一个程序,从多个音频和视频设备中读取数据,并将数据写入合适的容器(如mpeg)。我已经用Linux编写了代码,但现在我还必须为windows编写另一个版本。我是这样用Linux写的:

代码语言:javascript
复制
initialize the devices (audio: ALSA, video: V4L2)
get the file descriptors
mainloop
   select on file descriptors
   respond to the proper device

不幸的是,我的专业知识只适用于Linux,而且我从未使用过windows。我不知道什么是正确的范例。人们是否以同样的方式对待fds并进行选择?在这种情况下,是否有从directshow获得fd的方法?哦,还有最后一件事,我只能用一个线程来完成这一切。因此,具有多个线程同时运行和每个处理一个设备的解决方案是不可接受的。Linux中的代码目前也运行在一个线程上。我们也倾向于用c++编写代码。谢谢。

这里只问了一个问题,那就是:如何从库中获取视频/音频设备的文件描述符。曾经在V4L2和ALSA工作过的人,我正在DirectShow中寻找同样的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-12 08:08:34

罗曼是这些话题的专家,我认为你找不到更好的答案。为了补充罗曼的答案,您可以在DirectShow中这样做:

代码语言:javascript
复制
Enumerate video/audio capture devices/select capture device
Construct DirectShow graph
  Add video and audio capture source filters to graph
  Add 2 sample grabbers to graph
  Configure sample grabber callbacks 
  Connect capture source filters to samples grabbers
  Add renderers to graph (This could be a null renderer or a video/audio renderer)
  Connect sample grabbers to renderers
Play graph
Run the event loop
DirectShow will invoke the callbacks per media sample traversing the graph.

您的图形通常如下所示:

代码语言:javascript
复制
                callback
                   |
Video capture -- sample grabber -- renderer

Audio capture -- sample grabber -- renderer
                   |
                 callback

正如罗曼所说,SDK中有许多示例展示了如何

  • 枚举捕获源
  • 使用/配置示例抓取器
  • 编写一个应用程序,在该应用程序中构造和播放一个图形。

在线程的主题上,您将为主应用程序线程编写代码,DirectShow将处理内部线程管理。但是,请注意,如果您的回调函数处理强度很大,它可能会干扰回放,因为(来自MSDN

数据处理线程阻塞,直到回调方法返回。如果回调不迅速返回,则会干扰回放。

这可能重要,也可能不重要,这取决于您的应用程序需求。如果很重要,您可以将数据传递给另一个线程进行处理。阻塞数据处理线程的结果是,在视频的情况下,您将获得更低的帧。

票数 2
EN

Stack Overflow用户

发布于 2014-11-10 07:57:59

Windows提供了几个用于视频和音频的API,这是因为旧的API被假定的后代所取代,但是旧的API仍然可以运行,以保持与现有应用程序的兼容性。

音频API:waveInXxx系列函数,DirectSound,DirectShow,WASAPI

视频API: Windows、DirectShow、媒体基金会的视频

支持video+audio流和文件的视频/音频API: Windows视频、DirectShow、媒体基金会

上述所有这些都提供了某些功能、接口、方法、可扩展性和兼容性选项。我不认为fd,fds和select适用于上述任何一个。由于特定的原因,人们可能更喜欢使用API的组合,例如,只有WASAPI才能对音频捕获提供良好的控制,但是它只是音频API。音频压缩和媒体文件的制作(尤指)。启用视频,通常由DirectShow和媒体基金会处理.

视频和音频设备没有文件描述符。在DirectShow和Media中,您可以获得各自捕获设备的接口/对象,然后可以以特定的方式发现设备功能(如支持的格式)。然后,您可以获取捕获的数据,也可以将捕获组件连接到另一个对象,例如编码或表示数据。因为在Windows中,文件描述符不是故事的一部分,所以您的问题基本上就不清楚了。显然,您要求熟悉Linux和Windows开发的人提供一些指导,说明如何在Windows中实现您已经在Linux中所做的工作,但是,恐怕您必须以常规的Windows方式来完成它,以及Windows API在文档和示例中的建议和演示方式。

--

DirectShow和涵盖了整个媒体处理管道步骤:捕获、处理、演示。在DirectShow中,您使用连接在一起的组件“筛选器”构建管道(MF有类似的概念),然后高级应用程序控制它们的操作,而不接触实际数据。过滤器与数据交换,而不向应用程序报告每块数据流。

这就是为什么你可能很难找到一种可能的“得到一个原始的框架”。DirectShow设计假定原始帧在筛选器之间传递,而不是发送到调用应用程序。对于连接的过滤器来说,获取原始帧非常简单,您需要用DirectShow过滤器、库存或自定义来表达所有媒体数据处理需求。

不管出于什么原因,那些想从DirectShow管道中提取这个媒体数据流的人通常使用所谓的样例Grabber过滤器( OS和MSDN论坛上的数十个问题),它是一个易于处理的股票过滤器,能够接受回调函数并报告流经的每一段数据。此过滤器是从访问原始数据的捕获设备中提取帧的最简单方法。

DirectShow和Media标准视频捕获功能是基于支持在Windows中存在的模拟视频捕获设备的WDM驱动程序。对于它们,API有各自的组件/过滤器,它们可以在管道中连接。由于DirectShow相对容易扩展,因此可以将其他设备置于视频捕获过滤器的相同形状因子中,这可以覆盖通过SDK、虚拟相机等提供的第三方捕获设备。一旦它们被放入DirectShow过滤器中,它们就可以用于其他与DirectShow兼容的应用程序,特别是基本上没有区别,无论是实际的相机还是软件的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26228674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档