通过URL / JAVA播放音频/ wav文件

时间:2015-11-09 14:33:51

标签: java servlets wav

我有一个音频文件,当我点击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 []

1 个答案:

答案 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