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
Метод также должен работать и был бы предпочтительнее.