1

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

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

提前致谢。

4

1 回答 1

0

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

然后我会创建一个“永远”运行的“游戏循环”,或者直到你不再想要它,每次迭代我都会从每个流中获取指纹数据,并检查是否HashMap.keySet().contains(theFingerPrintData)来自相反的流。如果是这样,您将从中释放它HashMap并进行数学运算以找到延迟,如下所示:

另外,我不确定你的类用于你的指纹数据,所以在我的例子中,我将称之为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();
     }

  }

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

于 2017-04-20T16:07:26.953 回答