我已经在发布之前搜索了论坛(我没有找到我的问题的答案,因此发表这篇文章)。 我想制作一个播放来自shoutcast服务器的音频流的java应用程序。我在网上看了一下,发现javazoom对我想做的事情很有用。所以我下载了他们的包并开始实验。 我想出了这个,但我得到一个“javax.sound.sampled.UnsupportedAudioFileException:无法从输入网址获取音频输入流”
以下是代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
/**
*
* @author George
*/
import java.io.*;
import java.util.Map;
import java.net.*;
import javax.sound.sampled.*;
public class play {
public void testPlay(String filename)
{
try {
// File file = new File(filename);
URL file= new URL(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);
// Play now.
rawplay(decodedFormat, din);
in.close();
din = AudioSystem.getAudioInputStream(decodedFormat, in);
// DecodedMpegAudioInputStream properties
if (din instanceof javazoom.spi.PropertiesContainer)
{
Map properties = ((javazoom.spi.PropertiesContainer) din).properties();
float[] equalizer = (float[]) properties.get("mp3.equalizer");
equalizer[0] = (float) 0.5;
equalizer[31] = (float) 0.25;
}
} catch (Exception e)
{
System.out.println(e);
}
}
private void rawplay(AudioFormat targetFormat, AudioInputStream din) throws IOException, LineUnavailableException
{
byte[] data = new byte[4096];
SourceDataLine line = getLine(targetFormat);
if (line != null)
{
// Start
line.start();
int nBytesRead = 0, nBytesWritten = 0;
while (nBytesRead != -1)
{
nBytesRead = din.read(data, 0, data.length);
if (nBytesRead != -1) nBytesWritten = line.write(data, 0, nBytesRead);
}
// Stop
line.drain();
line.stop();
line.close();
din.close();
}
}
private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException
{
SourceDataLine res = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
res = (SourceDataLine) AudioSystem.getLine(info);
res.open(audioFormat);
return res;
}
}
答案 0 :(得分:1)
您确定您的网址是MP3数据的网址吗?您应该能够在本地保存流中的一些数据,然后将其作为MP3文件从标准媒体播放器应用程序播放。如果没有,你可能有一个坏流或一个其他格式。
另外,您是否正在使用JavaZoom提供的音频库实现来获得MP3支持?默认情况下,Java没有它。
您也可以尝试从shoutcast流中读取HTTP响应标头,它可能包含有关所服务内容的更详细信息。
祝你好运。