Как сделать так, чтобы массив частот точно изображал декодированный mp3-файл? - PullRequest
0 голосов
/ 20 октября 2018

Я использую 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;
}

}

1 Ответ

0 голосов
/ 30 октября 2018

Спасибо Брэду и VC.One за то, что они заставили меня осознать свои собственные ошибки.Для начала мне нужно было добавить правильные значения в кодировку со знаком PCM следующим образом:

AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
            (float)44.1,       //samplerate
            16,                //sampleSizeInBits
            2,                 //channels
            626,               //frameSize
            (float)38.4615385, //frameRate
            false);            //bigEndian

Затем мне нужно было точно представить 2 канала в массиве.То, как я сделал это выше в классе AnalyzeMP3, неверно, и его следует добавить так:

    //adds 4 values to i through the whole song
    int[][] offset  = new int[mp3.getBytes().size()/4][4];
    int counter = 0;
    for(int i = 0; i < mp3.getBytes().size()/4;i++) {
        for(int j = 0; j < 4; j++) {
            offset[i][j] = mp3.getBytes().get(counter);
            counter++;
        }

    }

После внесения этих изменений размер массива составляет 4351104.4351104/44100 равно длине песни в секундах.И нет заголовка или чего-либо, что я должен пропустить, массив теперь является точным представлением всей песни с 44100 частотами в секунду.Который может быть легко преобразован для представления 10 мс как 441 частота и т. Д.

...