2017-04-20 54 views
1

我想測量使用音頻指紋識別的兩個不同平臺上的一個實時流之間的延遲。目前我正在使用Java的musicg庫。我可以獲得信息,如光譜圖和指紋,但我無法弄清楚如何使用這些數據來測量延遲。使用音頻指紋識別測量延遲(Java)

我的問題是音樂庫是否足夠進行這種操作。如果是這樣,我如何使用我獲得的數據來找到兩個流之間的延遲。

在此先感謝。

回答

0

這是我會做的。我會創建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(); 
    } 

    } 

這可能需要進行調整了一點點,但本質上,我相信這是你在找什麼。