Потоковое аудио с диска в Java-сервлетах - PullRequest
0 голосов
/ 05 августа 2011

Для потокового аудио файла я реализовал следующий код.Но я получаю исключение:

javax.sound.sampled.UnsupportedAudioFileException: не удалось получить поток аудиовхода из входного файла на javax.sound.sampled.AudioSystem.getAudioInputStream (AudioSystem.java:1170)

Может ли кто-нибудь помочь мне, пожалуйста ......

    try {
        // From file

        System.out.println("hhhhhhhhhhhhhhhh");

        AudioInputStream stream = AudioSystem.getAudioInputStream(new File("C:\\track1.mp3"));

        System.out.println("stream created");

        AudioFormat format = stream.getFormat();
        if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {

            System.out.println("in if");

            format = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED,
                    format.getSampleRate(),
                    format.getSampleSizeInBits()*2,
                    format.getChannels(),
                    format.getFrameSize()*2,
                    format.getFrameRate(),
                    true);        // big endian
            stream = AudioSystem.getAudioInputStream(format, stream);
        }

        // Create line
        SourceDataLine.Info info = new DataLine.Info(
            SourceDataLine.class, stream.getFormat(),
            ((int)stream.getFrameLength()*format.getFrameSize()));
        SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
        line.open(stream.getFormat());
        line.start();

        // Continuously read and play chunks of audio
        int numRead = 0;
        byte[] buf = new byte[line.getBufferSize()];
        while ((numRead = stream.read(buf, 0, buf.length)) >= 0) {
            int offset = 0;
            while (offset < numRead) {
                offset += line.write(buf, offset, numRead-offset);
            }
        }
        line.drain();
        line.stop();
    }

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

То, что вы выполняете эту работу в классе сервлетов, создает у меня впечатление, что вы намереваетесь воспроизводить mp3-файл всякий раз, когда кто-то посещает ваш сайт, и что посетитель должен услышать этот mp3-файл.

Если trueИзвините, но вы подходите к этому совершенно неправильно.Код сервлета Java запускается на компьютере веб-сервера, а не на компьютере веб-браузера.Каждый раз, когда кто-то посещает ваш сайт, таким образом, mp3-файл будет воспроизводиться только на сервере веб-сервера.Обычно это физически совершенно другая машина, которая работает на другой стороне сетевого соединения, и посетитель никогда не услышит музыку.

Вы хотите отправить необработанный (неизмененный побайтно-байтовый) файл mp3 с веб-сервера на веб-браузер, не массируя его каким-либо Java Audio API, и дать указание веб-браузеру воспроизвести этот файл.Самый простой способ - просто удалить mp3-файл в общедоступном веб-контенте (там, где также находятся ваши HTML / JSP-файлы) и использовать тег HTML <embed> для встраивания его в ваш HTML / JSP-файл.В приведенном ниже примере предполагается, что файл MP3 находится в той же папке, что и файл HTML / JSP:

<embed src="file.mp3" autostart="true"></embed>

Это все, и это поддерживается практически во всех браузерах, и он также отображает проигрыватель.

Если файл MP3 по деловому требованию хранится вне общедоступного веб-контента, то для этого вам действительно может понадобиться сервлет, но сервлет не должен делать ничего другого, кроме как каким-то образом получить InputStream и записать его без измененийдо OutputStream из HttpServletResponse обычного способа ввода-вывода Java.Вам нужно только предварительно установить заголовок HTTP Content-Type на audio/mpeg и, если возможно, также заголовок HTTP Content-Length.Затем укажите src на URL сервлета.

<embed src="mp3servlet" autostart="true"></embed>
2 голосов
/ 05 августа 2011

По умолчанию java AudioInputStream не поддерживает mp3-файлы. Вы должны подключить MP3SPI , чтобы он мог декодировать mp3.

Также, что вы подразумеваете под потоковым? Этот код будет воспроизводить аудиофайл, а не потоковую передачу, как при потоковой передаче через интернет-радио.

...