2015-11-14 75 views
0

如何比較2個mp3文件的內容?如果我有兩個mp3文件,我只知道它們的大小和長度,沒有其他信息[標題,藝術家...],如何將它們的內容與Java進行比較?現在我只能看它們的大小和長度(播放時間)來估計它們是否相似,並且必須聽取它們以確定它們是否具有相同的聲音,如果只有其中一些可以聽對他們來說,但是如果他們有成千上萬的人,這是不切實際的。有沒有辦法使用Java來比較mp3文件?

我不知道是否有一種方法可以使用java讀取數據,並比較聲音數據[音高和音量...]以查找它們的相似程度,如果它們98%相似,則可以聽取他們的意見,以確定他們是否實際上是相同的聲音,有沒有辦法做到這一點?此外,即使2個mp3文件包含相同的聲音,它們可能會關閉幾秒鐘,但其餘內容相同,因此在比較其數據時,算法需要左移或右移以匹配數據叮咬。

在Java中必須有一些現有的方法來做到這一點,如果有人能夠向我展示一些示例代碼或指向正確的方向,我將不勝感激。

經過一番研究,我發現這篇文章:Comparing two different audio files doesn't work

我想通了,這裏是我的答案[何必把它抱?!我無法回答自己的問題,現在我必須在這裏做! ]

import com.musicg.fingerprint.*; 
import com.musicg.wave.*; 
import it.sauronsoftware.jave.*; 
... 

public class Compare_Files 
{ 
... 
    String Dir_Data="C:/Dir_Data/",Result_Similarity, 
     MP3_File_1=Dir_Data+"Song_1.mp3",MP3_File_2=Dir_Data+"Song_2.mp3",MP3_File_3=Dir_Data+"Song_3.mp3", 
     WAV_File_1=Dir_Data+"Song_1.wav",WAV_File_2=Dir_Data+"Song_2.wav",WAV_File_3=Dir_Data+"Song_3.wav"; 

    public Compare_Files() 
    { 
    Convert_MP3_To_Wav(MP3_File_1,WAV_File_1); 
    Convert_MP3_To_Wav(MP3_File_2,WAV_File_2); 
// Convert_MP3_To_Wav(MP3_File_3,WAV_File_3); 
    Compare_Wav_Files(WAV_File_1,WAV_File_2); 
    } 

    void Compare_Wav_Files(String Wav_File_1,String Wav_File_2) 
    { 
    Wave record1=new Wave(Wav_File_1); 
    Wave record2=new Wave(Wav_File_2); 
    FingerprintSimilarity Similarity=record1.getFingerprintSimilarity(record2); 
    Result_Similarity=" Similarity = "+(100*Similarity.getSimilarity())+" %"; 
    Out(Result_Similarity); 
    } 

    void Convert_MP3_To_Wav(String Input_MP3_File,String Output_Wav_File) 
    { 
    File MP3_File=new File(Input_MP3_File),Wav_File=new File(Output_Wav_File); 

    try 
    { 
     AudioAttributes audio=new AudioAttributes(); 
     audio.setCodec("pcm_s16le"); 
     audio.setBitRate(128000); 
     audio.setChannels(2); 
     audio.setSamplingRate(44100); 
     EncodingAttributes attrs=new EncodingAttributes(); 
     attrs.setFormat("wav"); 
     attrs.setAudioAttributes(audio); 
     Encoder encoder=new Encoder(); 
     encoder.encode(MP3_File,Wav_File,attrs);  
    } 
    catch (Exception e) { e.printStackTrace(); } 
    } 
+0

定義「比較他們的內容」。你的意思是絕對平等嗎?還是你真的想把同一首歌曲的同一首歌曲的不同錄音匹配到同一個? – Turing85

+0

好的問題是,潛在的Java程序的目的是幫助我減少消除重複聲音的時間和精力,因此,無論您提出哪種方式都會有所幫助,只需要提供類似的指示符:EQUAL或SIMILAR。 – Frank

+0

你可以隨時打開這些文件,把它看作是一個'byte []'外觀,它們是否相同。這絕對是相似的。要檢查第二種類型的相似性...這是一個不同的故事。 – Turing85

回答

相關問題