如何比较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(); }
}
答案 0 :(得分:1)
查看这个开源解决方案:
它不是Java,但你可能会为它生成JNI绑定。看起来有人已经为Android做过: