使用音频指纹测量延迟 (Java)

Measuring delay with audio fingerprinting (Java)

我想使用音频指纹测量两个不同平台上的一个直播流之间的延迟。目前我正在为 Java 使用 musicg 库。我可以获得诸如频谱图和指纹之类的信息,但我无法弄清楚如何使用这些数据来测量延迟。

我的问题是 musicg 库是否足以进行这种操作。如果是这样,我如何使用我获取的数据来找到两个流之间的延迟。

提前致谢。

这是我会做的。我会创建 2 HashMap<FingerprintData, Long>s。本质上,您是将流中的指纹数据映射到 System.nanoTime() 的回复。

然后我会创建一个运行 "forever" 的 "game-loop",或者直到您不再需要它为止,每次迭代我都会从每个流中获取指纹数据并检查是否来自相反流的HashMap.keySet().contains(theFingerPrintData)。如果是这样,您将从 HashMap 中释放它并计算延迟,如下所示:

另外,我不确定你的 class 用于你的指纹数据,所以在我的示例中我将其称为 FingerprintData

Map<FingerprintData, Long> stream1Timestamps = new HashMap<>();
Map<FingerprintData, Long> stream2Timestamps = new HashMap<>();

StreamClass stream1 = howEverYouFetchStream(1);
StreamClass stream2 = howEverYouFetchStream(2);

while(true /*or if you have conditional to terminate place it here*/){
     FingerprintData stream1fpd = stream1.getFingerprintData();
     FingerprintData stream2fpd = stream2.getFingerprintData();

     if(stream1Timestamps.keySet().contains(stream2fpd)){
         Long firstHeard = stream1Timestamps.get(stream2fpd);
         System.out.println("stream 2 is delayed:" +System.nanoTime()-firstHeard + " nanoseconds");
         stream1Timestamps.remove(stream2fpd);
     }else{
         stream2Timestamps.put(stream2fpd, System.nanoTime();
     }

     if(stream2Timestamps.keySet().contains(stream1fpd)){
         Long firstHeard = stream2Timestamps.get(stream1fpd);
         System.out.println("stream 1 is delayed:" +System.nanoTime()-firstHeard + " nanoseconds");
         stream2Timestamps.remove(stream1fpd);
     }else{
         stream1Timestamps.put(stream1fpd, System.nanoTime();
     }

  }

这可能需要稍微调整一下,但基本上我相信这就是您要找的。