您好我正在编写一个必须同时从三个输入设备捕获的程序(在这种情况下,它是三个相同的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()。
我试图搜索代码示例,但我没有找到任何与多个捕获同时有关的内容。任何提示都将不胜感激!
答案 0 :(得分:2)
ALSA基于熟悉的UNIX范例“一切都是文件”;所以要处理多个设备,你应该使用poll(3)。
有多个ALSA插件在多个文件之上实现,因此每个PCM设备可能有多个句柄。
为每个设备调用snd_pcm_poll_descriptors_count以了解您需要多少pollfd
个结构,然后调用snd_pcm_poll_descriptors以获取文件句柄和相应的event
位。
在您的循环中,在致电poll
后,您不得直接阅读pollfd
结构中的vales,而是致电snd_pcm_poll_descriptors_revents将其翻译回来。
要确保多个设备同时启动,请致电snd_pcm_link。 但是,这并不能保证设备以相同的速度运行。