[英]Playing a audio/wav file through URL/JAVA
我有一个音频文件,当我单击URL(例如)abcd / audio / sound1.wav时将播放该文件。浏览器播放音频。
现在我的要求是,有一个vxml应用程序,该应用程序将命中URL并播放音频。 音频是动态选择的。 我有一个正在运行的servlet,(基于vxml或servlet URL来获取音频文件)或某些条件,它将选择/创建一个音频文件。 1个选项是我将音频保存在某个路径中并返回该路径,以后将播放vxml。 但是,我想要的是,而不是返回路径,我将提供整个音频以使其在响应中播放。
示例代码:
response.setContentType("audio/x-wav");
ServletOutputStream outStream = response.getOutputStream();
response.setHeader("Accept-Ranges", "bytes");
byte[] audioBytes = null;
try {
audioBytes = Utils.getWavBytes("abc.wav");
response.setContentLength(audioBytes.length);
outStream.write(audioBytes, 0, audioBytes.length);
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但是当我点击包含此代码的URL时,浏览器无法播放。 注意:getWavBytes()只是将abc.wav解码为字节[]
我认为这是因为您不能在OutputStream
直接写入整个字节数组,我建议使用诸如appache IOUtils之类的东西来复制它。
response.setContentLength(audioBytes.length);
ByteArrayInputStream is = new ByteArrayInputStream(audioBytes);
IOUtils.copy(is, outStream);
或者如果您不想使用库:
public static int copy(InputStream input, OutputStream output) throws IOException {
long count = copyLarge(input, output);
if (count > 2147483647L) return -1;
else return (int) count;
}
public static long copyLarge(InputStream input, OutputStream output) throws IOException {
byte buffer[] = new byte[4096];
long count = 0L;
for (int n = 0; -1 != (n = input.read(buffer));) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
您可能会发现一个部署在此处的工作示例: https : //immense-waters-1854.herokuapp.com/hello
https://github.com/x4d3/webapp-get-sound/blob/master/src/main/java/servlet/HelloServlet.java
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.