有没有办法使用Java来比较mp3文件?

时间:2015-11-14 17:35:09

标签: java audio mp3

如何比较2个mp3文件的内容?如果我有2个mp3文件,我只知道它们的大小和长度而没有其他信息[标题,艺术家...],如何将它们的内容与Java进行比较?现在我只能看看它们的大小和长度[播放时间]来估计它们是否相似,并且必须听取它们来判断它们是否具有相同的声音,如果它们只有少数它们的话。好的只是听他们说,但如果有成百上千的,这是不切实际的。

我想知道是否有一种方法可以使用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(); }
  }

1 个答案:

答案 0 :(得分:1)

查看这个开源解决方案:

http://echoprint.me/start

它不是Java,但你可能会为它生成JNI绑定。看起来有人已经为Android做过:

https://github.com/echonest/EchoprintForAndroid

相关问题