我有一个音频文件,当我点击URL时播放(说) A.B.C.D /音频/ 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();
}
但是当我点击包含此代码的网址时,浏览器无法播放。 注意:getWavBytes()只是将abc.wav解码为byte []
答案 0 :(得分:0)
我认为这是因为你无法直接在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