0

嗨,我正在编写一个必须同时从三个输入设备捕获的程序(在这种情况下,它是三个相同的 USB 网络摄像头)。

首先,ALSA 不是基于熟悉的 UNIX 范式“一切都是文件”,所以我不能使用常规的 poll(3) 调用;知道所有设备之间的数据流应该是稳定的,现在我做了类似的事情:

while(!stop)
  for(i = 0; i < input_device_count; i++)
  {
    snd_pcm_readi(handle[i], buffer, frames);
    write(fd_out[i], buffer, size);
  }

此代码遍历每个设备并从中读取,将结果写入先前打开的文件中。它有效,但我怀疑有更好的方法来做到这一点,也使用 mmap,所以我不必从内核空间复制到用户并再次复制到内核。

暂时,让我们假设三个输入保持同步;上面的代码仍然不能保证我会同时从三个设备开始录制。有没有办法保证?事实上,像 snd_pcm_prepare() 和 snd_pcm_start() 这样的调用的语义是什么?现在我没有使用那些,我直接去 snd_pcm_readi()。

我试图搜索代码示例,但我没有找到任何与同时多个捕获有关的东西。任何提示将不胜感激!

4

1 回答 1

2

ALSA 基于熟悉的 UNIX 范式“一切都是文件”;所以要处理多个设备,你应该使用 poll(3)。

在多个文件之上实现了 ALSA 插件,因此每个 PCM 设备可能有多个句柄。为每个设备调用snd_pcm_poll_descriptors_count以了解您需要多少个pollfd结构,然后调用snd_pcm_poll_descriptors以获取文件句柄和相应的event位。

在您的循环中,在调用 之后poll,您不能pollfd直接读取结构中的值,而是调用snd_pcm_poll_descriptors_revents将它们翻译回来。


要确保多个设备同时启动,请调用snd_pcm_link。但是,这并不能保证设备将以相同的速度运行。

于 2013-11-06T07:54:44.917 回答