嗨,我正在编写一个必须同时从三个输入设备捕获的程序(在这种情况下,它是三个相同的 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()。
我试图搜索代码示例,但我没有找到任何与同时多个捕获有关的东西。任何提示将不胜感激!