为了流式传输音频文件,我实现了以下代码。但我遇到了异常:
javax.sound.sampled.UnsupportedAudioFileException:无法从输入文件获取音频输入流 在 javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
谁能帮帮我......
try {
// From file
System.out.println("hhhhhhhhhhhhhhhh");
AudioInputStream stream = AudioSystem.getAudioInputStream(new File("C:\\track1.mp3"));
System.out.println("stream created");
AudioFormat format = stream.getFormat();
if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
System.out.println("in if");
format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(),
format.getSampleSizeInBits()*2,
format.getChannels(),
format.getFrameSize()*2,
format.getFrameRate(),
true); // big endian
stream = AudioSystem.getAudioInputStream(format, stream);
}
// Create line
SourceDataLine.Info info = new DataLine.Info(
SourceDataLine.class, stream.getFormat(),
((int)stream.getFrameLength()*format.getFrameSize()));
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open(stream.getFormat());
line.start();
// Continuously read and play chunks of audio
int numRead = 0;
byte[] buf = new byte[line.getBufferSize()];
while ((numRead = stream.read(buf, 0, buf.length)) >= 0) {
int offset = 0;
while (offset < numRead) {
offset += line.write(buf, offset, numRead-offset);
}
}
line.drain();
line.stop();
}
最佳答案
您在 servlet 类中完成这项工作给我的印象是,您的意图是每当有人访问您的网站时就播放 mp3 文件,并且访问者应该听到这个 mp3 文件。
如果这是真的,我很遗憾地说,但你的做法完全错误。 Java servlet 代码在网络服务器计算机中运行,而不是在网络浏览器计算机中运行。每当有人访问您的网站时,这样 mp3 文件只会在网络服务器计算机上播放。这通常是一台物理上完全不同的机器,运行在网络连接的另一端,访问者永远不会听到音乐。
您想要将 mp3 文件原始(未逐字节修改)从网络服务器发送到网络浏览器,而不通过某些 Java 音频 API 对其进行处理,并指示网络浏览器播放该文件。最简单的方法是将 mp3 文件拖放到公共(public) web 内容中(您的 HTML/JSP 文件也在那里)并使用 HTML <embed>
标记将其嵌入到您的 HTML/JSP 文件中。下面的示例假设 MP3 文件与 HTML/JSP 文件位于同一文件夹中:
<embed src="file.mp3" autostart="true"></embed>
仅此而已,几乎所有浏览器都支持此功能,并且它也会显示播放器。
如果 MP3 文件是根据业务要求存储在公共(public) Web 内容之外的,那么您可能确实需要一个 servlet,但该 servlet 应该只获取一个 InputStream
。以某种方式将其写入并未经修改地写入 OutputStream
HttpServletResponse
的通常的 Java IO 方式。只需要设置HTTP Content-Type
标题为 audio/mpeg
事先,如果可能的话,还可以使用 HTTP Content-Length
header 。然后点src
改为 servlet 的 URL。
<embed src="mp3servlet" autostart="true"></embed>
关于java - java Servlet 中磁盘的音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953913/