繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM