Java онлайн радио плеер
Пожалуйста, помогите мне решить это. Я пытаюсь транслировать онлайн-радиостанцию. Пока что мне не повезло. Предполагается, что Vorbis решит проблему с чтением формата файла OGG, поэтому у меня есть проект maven со следующими зависимостями:
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>tritonus-share</artifactId>
<version>0.3.7.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.soundlibs/mp3spi -->
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.soundlibs/vorbisspi -->
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>vorbisspi</artifactId>
<version>1.0.3.3</version>
</dependency>
Но мой код выдает исключение:
Исключение в потоке "Thread-1" java.lang.IllegalArgumentException: недопустимый запрос на запись нецелого числа кадров (12698 байтов, frameSize = 4 байта)
Я не могу понять, что не так. Как мне запустить эту штуку? Насколько я понимаю, SourceDataLine является выходом DataLine.Info, который содержит AudioInputStream. Когда я открываю SourceDataLine и запускаю его, он ожидает записи данных в буфер, а затем начинает чтение. Скорее всего, буфер, который я передаю методу записи, имеет неправильный формат. Я не знаю. Последний день я бился головой о стену.
Это код, который я до сих пор:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.DataLine.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;
public class AudioPlayer {
private static URL url;
public static void main(String[] args) {
final AudioPlayer player = new AudioPlayer();
// player.play("something.mp3");
try {
url = new URL("http://stream.metacast.eu/nrj.ogg");
player.play(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public void play(URL url) {
try {
final AudioInputStream in = getAudioInputStream(url);
final AudioFormat outFormat = getOutFormat(in.getFormat());
final DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, outFormat);
final SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(sourceInfo);
sourceLine.open();
Thread sourceThread = new Thread() {
@Override
public void run() {
sourceLine.start();
byte[] data = new byte[65536];
int readBytes;
while (true) {
try {
readBytes = in.read(data, 0, data.length);
sourceLine.write(data, 0, readBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
System.out.println("Start playing ...");
sourceThread.start();
Thread.sleep(20000);
sourceLine.stop();
sourceLine.close();
} catch (UnsupportedAudioFileException | LineUnavailableException | IOException | InterruptedException e) {
throw new IllegalStateException(e);
}
}
private AudioFormat getOutFormat(AudioFormat inFormat) {
final int ch = inFormat.getChannels();
final float rate = inFormat.getSampleRate();
return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
}
}