2012-08-04 55 views
2

我似乎遇到了一件看起來很瑣碎的事情。Java中的簡單Wav比較

目標:嘗試比較兩個Wav文件,看看其中一個(小文件)是否是其他文件(大文件)的一部分。

測試:首先,我花了1分鐘長的一段音頻並將其導出30秒到另一個文件。我首先嚐試簡單地讀取byte []數據並通過日誌查看它,即使它們都來自同一個源文件,它們之間絕對沒有關係?然後我嘗試使用WavFile和MusicG等庫,但是我根本看不到兩個「指紋」或甚至是來自兩個文件的原始字節數據之間的任何關聯?

問題什麼是最簡單的方法來分析這兩個WAV文件的相似之處?我已經讀過,如果他們來自同一個源音頻文件,他們應該是字節字節相同。因此,採取每個樣品,他們應該是相同的?那不是發生了什麼?

現在我已經搜索了很多這個問題,但幾乎所有的答案都只有25-50%完成,所以我覺得我錯過了一個巨大的片段。

感謝您提供任何解決方案!

[編輯]源音頻文件只是一個1分鐘的WAV文件...我從頭開始提取30秒來創建較小的文件。然後我比較短(30秒)和長(1分鐘)。我以1141kbps,16bit,Wav輸出了Audacity。這是爲了儘量避免格式問題...我想

對於代碼看看這個懸而未決的問題:Wav comparison, same file

+0

在這種情況下,「源音頻文件」是什麼? – 2012-08-04 21:11:47

+0

源音頻文件只是一個1分鐘的WAV文件...我從頭開始提取30秒來創建較小的文件。然後我比較短的(30秒)和長的(1分鐘的) – 2012-08-04 21:12:57

+0

當你輸出30秒時,你確定你使用了完全相同的格式嗎? – 2012-08-04 21:17:04

回答

3

有一些奇怪的事情怎麼回事。沒有詳細說明,我只會說,當某些程序執行簡單的操作時,例如您稱之爲「提取」的操作時,它們不會進行精確的複製。例如,Libsndfile在從int聲音文件轉換爲float(Audacity內部使用的)時不會透明轉換回int。如果Audacity使用libsndfile(我敢肯定它),它不會製作透明的文件副本,所以你的方法將無法工作。例如:嘗試以下操作:打開一個wav文件,使用相同的參數導出它。使用diff來比較輸入和輸出。很有可能他們會有所不同。欲瞭解更多詳情請看這裏:http://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html

libsndfile筆者在這裏捍衛自己的設計決定:http://www.mega-nerd.com/libsndfile/FAQ.html#Q010

你可以嘗試其他的應用程序,但我懷疑你想,當人們有膽識這甚至工作。

其中一條評論提示了互相關。你也可以使用音頻指紋。雖然這兩種解決方案都有些複雜。

可能最簡單的解決方案是以本機格式讀取數據。例如,如果文件是16位,則讀取16位整數(而不是字節)。然後將它與較短的一個進行比較,但比較允許出現一些錯誤(從我的頭頂開始,我確信你永遠不應該超過一個,但這是每次都通過大膽)。因此,不要問「這些數值是否相等」,你不得不問「這些數值是否在彼此之內」。當然,對於他們中有很多沉默的事情,你會想要做出某種例外。

大膽性也可能使用抖動,所以請確保關閉。抖動會增加顯着的噪音,所以如果您想將其用於方程中,您將需要一個不同的解決方案。