使用音频指纹测量延迟 (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();
}
}
这可能需要稍微调整一下,但基本上我相信这就是您要找的。
我想使用音频指纹测量两个不同平台上的一个直播流之间的延迟。目前我正在为 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();
}
}
这可能需要稍微调整一下,但基本上我相信这就是您要找的。