Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaSound API从麦克风阵列同步录制_Java_Microphone_Javasound - Fatal编程技术网

使用JavaSound API从麦克风阵列同步录制

使用JavaSound API从麦克风阵列同步录制,java,microphone,javasound,Java,Microphone,Javasound,我已经通过并成功地从麦克风读取了数据 我现在想更进一步,从麦克风阵列中的多个麦克风(如PS3 Eye或Respeaker)同步获取数据 我可以为每个麦克风获得一条TargetDataLine,并打开/启动/将输入写入缓冲区-但我不知道如何做到这一点,以提供数据,然后按时间排列(我希望最终进行波束形成) 当我从类似ALSA的东西中读取数据时,我会同时从不同的麦克风中获取字节,因此,我知道每个麦克风的每个字节都来自同一时间-但是Java Sound API似乎有一个抽象,使b/c混淆了您只是从单独的

我已经通过并成功地从麦克风读取了数据

我现在想更进一步,从麦克风阵列中的多个麦克风(如PS3 Eye或Respeaker)同步获取数据

我可以为每个麦克风获得一条
TargetDataLine
,并打开/启动/将输入写入缓冲区-但我不知道如何做到这一点,以提供数据,然后按时间排列(我希望最终进行波束形成)

当我从类似ALSA的东西中读取数据时,我会同时从不同的麦克风中获取字节,因此,我知道每个麦克风的每个字节都来自同一时间-但是Java Sound API似乎有一个抽象,使b/c混淆了您只是从单独的行缓冲区中转储/写入数据并对其进行处理,而每一行都单独运行。您不能同时与整个设备/麦克风阵列进行交互


然而,我发现有人设法用Java做了波束形成,所以我知道这应该是可能的。问题是,秘密酱汁在从其他软件中取出的
.jar
中的自定义混合器对象中。。因此,我没有任何简单的方法来弄清楚他们是如何实现的

只有在底层硬件驱动程序支持的情况下,您才能以时间同步精度对齐多个源的数据,以执行波束形成

如果基础硬件为您提供多个同步数据流(例如,在2个通道中录制-立体声),则您的阵列数据将进行时间同步

如果您依赖操作系统仅仅为您提供两个独立的流,那么您可以依赖时间戳。你得到第一个元素的时间戳了吗?如果是这样,则可以根据采样率删除样本,从而重新对齐数据。在波束形成算法中可能会有一个最终的差异(δ-t)

阅读有关PS3 Eye(它有一系列麦克风)的文章,如果音频驱动程序同时提供所有频道,您将能够做到这一点

对于Java,这可能意味着“您能用包含4个通道的打开通道吗”?如果是,那么您的样本将包含多个帧,并且解码的帧数据(几乎可以肯定)将是时间对齐的。 引用一句话:“一帧包含特定时间所有通道的数据”。

IDK什么是“波束形成”,但如果有硬件可以提供同步,使用它显然是最好的解决方案

这里值得一提的是,它应该是一种合理的算法方法来管理同步

(1) 为每个
TargetDataLine
设置一个帧计数器。在此过程中,您必须将字节转换为PCM

(2) 设置一些代码来监控每条线路上的音量水平,我会假设在PCM数据上使用某种RMS算法

(3) 创建一个同时到达每个麦克风的响亮瞬时脉冲群,RMS算法能够检测到该脉冲群,并给出开始时的帧数

(4) 根据需要调整帧计数器,并在每行传入数据上引用它们

理由:Java不提供实时保证,正如本文在上所解释的那样。但根据我的经验,字节数据和时间(按采样率)之间的对应关系在最接近Java与外部音频服务接口的线路上非常精确


帧计数在不漂移的情况下能保持准确多久?我从来没有做过任何测试来研究这个问题。但在实践层面上,我已经编写了一个基于帧计数的完全令人满意的“音频事件”调度器,用于通过实时合成(全部使用Java完成)播放多部分分数,并且对于尝试的最长作文(6-7分钟)来说,计时是无可挑剔的。

哦,这是一个好观点!我忘了一条线可以有多个频道。我必须尝试一下,并检查所有麦克风是否在同一条
TargetDataLine
上。希望他们是:)如果成功的话,我会在这里记下。谢谢你的帮助谢谢你指出这一点每次开始录音你都必须校准计时(你的第3点)?你能相信波束形成所需的亚毫秒计时精度的一次性校准吗?我不知道。如果您在校准后保持麦克风连接和线路运行,并保持帧计数,无论是否记录,它们都可能保持对齐。我假设精度与采样率类似或更好。我认为,通过某种“阻塞队列”机制,可以保持计时的准确性,这种机制允许JVM进行多线程跳转。音频线路在阻塞状态下花费大量时间——处理速度超过播放速度。但大部分情况下,我只是根据我所知的一点和我所听到的Java播放(听起来不错)进行推断。