Есть ли способ использовать Java для сравнения mp3 файлов?

Как сравнить 2 mp3 файла для их содержимого? Если у меня есть 2 mp3 файла, я знаю только их размер и длину без другой информации [title, artist...], как сравнить их содержимое с Java? Прямо сейчас я могу только посмотреть их размер и длину [время воспроизведения], чтобы оценить, похожи ли они, и прислушаться к ним, чтобы решить, имеют ли они одинаковый звук, если есть только несколько из них, это нормально, чтобы просто слушать к ним, но если их сотни и тысячи, это непрактично.

Интересно, есть ли способ использовать java для чтения в данных и сравнить звуковые фрагменты [pitch and volume...] в цифровом виде, чтобы найти, насколько они похожи, если они похожи на 98%, я могу потом их слушать решить, являются ли они на самом деле одним и тем же звуком, есть ли способ сделать это? Кроме того, есть вероятность, что даже если 2 mp3 файла содержат одни и те же звуки, они могут быть отключены на несколько секунд, но остальная часть контента одинакова, поэтому при сравнении их данных алгоритм должен сдвигать влево или вправо для соответствия укусам данных.

Должны быть какие-то существующие способы сделать это в Java, я буду признателен, если кто-то может показать мне пример кода или указать мне в правильном направлении.

После некоторых исследований я нашел эту статью: сравнение двух разных аудиофайлов не работает

И я понял это, вот мой ответ [зачем его откладывать?! Я не мог ответить на свой вопрос, теперь я должен сделать это здесь! ]

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
источник поделиться
1 ответ

Проверьте это решение с открытым исходным кодом:

http://echoprint.me/start

Это не Java, но вы могли бы, вероятно, создать привязки JNI для него. Похоже, что кто-то уже сделал это для Android:

https://github.com/echonest/EchoprintForAndroid

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос