【发布时间】:2017-04-20 15:42:24
【问题描述】:
我想使用音频指纹来测量两个不同平台上的一个直播之间的延迟。目前我正在使用 Java 的 musicg 库。我可以获得诸如频谱图和指纹之类的信息,但我不知道如何使用这些数据来测量延迟。
我的问题是musicg库是否足以进行这种操作。如果是这样,我如何使用我获得的数据来找到两个流之间的延迟。
提前致谢。
【问题讨论】:
标签: java audio fingerprinting
我想使用音频指纹来测量两个不同平台上的一个直播之间的延迟。目前我正在使用 Java 的 musicg 库。我可以获得诸如频谱图和指纹之类的信息,但我不知道如何使用这些数据来测量延迟。
我的问题是musicg库是否足以进行这种操作。如果是这样,我如何使用我获得的数据来找到两个流之间的延迟。
提前致谢。
【问题讨论】:
标签: java audio fingerprinting
这就是我要做的。我会创建 2 个HashMap<FingerprintData, Long>s。本质上,您将流中的指纹数据映射到来自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();
}
}
这可能需要稍作调整,但基本上我相信这就是您要寻找的。p>
【讨论】: