2015-11-09 4 views
0

У меня есть аудиофайл, который воспроизводится, когда я нажимаю URL (говорит) a.b.c.d/audio/sound1.wav Браузер воспроизводит аудио.Воспроизведение аудио/wav-файла по URL/JAVA

Теперь мое требование: есть приложение vxml, которое ударит по URL-адресу и должно воспроизвести аудио. Звук динамически выбирается. У меня есть сервлет работает, (vxml ударит 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 в Byte []

+0

Вы не должны декодировать wav, просто отправьте его байтом по байту, как он есть на вашем диске –

+0

Можете ли вы добавить HTTP-ответ, где он работает, и он не работает к? – Reinard

+0

Декодирование смысла, я читаю файл и формирую bytearray. Затем я пишу массив байтов в ответ. – Shelly

ответ

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

Смежные вопросы