Java с использованием файлов mp3, ogg и wav с javax.sound.sampled.Clip (или получение битрейта звукового файла)

Моя цель - одновременно воспроизводить несколько музыкальных файлов в формате mp3, ogg или wav, чтобы создавать адаптивную музыку в видеоигре.

Вместо использования класса Clip из java sound API мне удалось создать класс с именем Track, который благодаря mp3spi и vorbisspi может читать файлы mp3, ogg и wav, записывая аудиоданные в SourceDataLine. Я нашел это решение благодаря этому сообщению:

/questions/48195476/igrayamp3-iwav-v-java/48195502#48195502

Все отлично работает с потоком в функции потока, поэтому я могу создать множество объектов Track для одновременного воспроизведения нескольких звуков. Но я хочу создать такую ​​функцию, как void setMicrosecondPosition(long microseconds); из класса Clip.

Я много чего перепробовал и нашел способ:

      in = getAudioInputStream(new File(file).getAbsoluteFile());
int seconds = 410;
int bitrate = 320; //in kbit/s
in.skip(seconds*bitrate*1000/8); // divided by 8 because the skip method use bytes.

Но мне нужен битрейт файла. Итак, как я могу получить битрейт любого звукового файла? Или лучше, как я могу использовать файлы mp3 и ogg с классом javax.sound.sampled.Clip .

1 ответ

Я верю, что если у тебя действительно есть работа AudioInputStreams, функция ссылается на количество байтов, которое должно быть фиксированным количеством на кадр, определяемым аудиоформатом. Например, стерео, 16 бит будет 4 байта на кадр, независимо. Таким образом, вы должны иметь возможность использовать частоту кадров (например, 44100 кадров / сек), чтобы перейти к желаемой начальной точке.

Еще одна уловка - читать, но игнорировать байты, поступающие из AudioInputStream в методе, аналогичном streamв примере решения для ссылки. Вы можете довольно быстро добраться до нужной точки, так как SDL вас не заблокирует. write(). Но если это сработает, skip Метод также должен работать и был бы предпочтительнее.

Другие вопросы по тегам