Я использую mp3spi и Triton, и этот код будет обрабатывать исключительно 192kbps mp3 файлы.Проблема, с которой я сталкиваюсь, заключается в том, что первая секунда hz состоит в основном из:
0,0,0,0 или 255,255,255,255
Я действительно считаю, что не могу пропустить заголовокправильно, в этом случае частоты не являются истинным изображением mp3 в этой конкретной мс.Кто-нибудь видит что-то не так с тем, как я пропускаю заголовок, или как я складываю байты в массив?
Другими словами, я хочу, чтобы массив в позиции [0] был равен mp3 в позиции 00:00:00, а массив в позиции [44100] равен песне ровно 1секунда.
Это код, который я использую для чтения байтов из файла mp3 и добавления его в байты массива.
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class ReadMP3 {
private ArrayList<Integer> bytes = new ArrayList<>();
private AudioFormat decodedFormat;
public ReadMP3() throws UnsupportedAudioFileException, IOException {
String filename = new ReadFiles().getFile();
File file = new File(filename);
AudioInputStream in = AudioSystem.getAudioInputStream(file);
AudioInputStream din = null;
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new
AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
din = AudioSystem.getAudioInputStream(decodedFormat, in);
this.decodedFormat = decodedFormat;
int i = 0;
while(true){
int currentByte = din.read();
if (currentByte == -1) {break;}
bytes.add(i, currentByte);
i++;
}
din.close();
in.close();
}
Это вторая часть моего кода, гдеЯ добавляю 4 байта к каждому индексу массива, так что array.length / 44100 равна длине песни в секундах.Это означает, что каждый массив [i] [4] равен 1 Гц.и массив [0] [4] до массива [44100] [4] является первой секундой песни.
public class AnalyzeMP3 {
//adds 4 bytes to offset[i], where each i represents 1hz,
//and 44100hz=1sec
public static int[][] calculate(ReadMP3 mp3) {
//calculates and prints how long the song is
double seconds = mp3.getBytes().size() /
mp3.getDecodedFormat().getFrameRate() / 4;
System.out.println("Length of song: " + (int)seconds + "s");
//adds 4 values to i through the whole song
int[][] offset = new int[mp3.getBytes().size()/4][4];
for(int i = 0; i < mp3.getBytes().size()/4; i++) {
for(int j = 0; j < 4; j++) {
offset[i][j] = mp3.getBytes().get(i+j);
}
}
return offset;
}
}