开发者

Audio Streaming from disk in java Servlets

To stream audio file I have implemented following code. But i am getting Exception:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)

Can Any one help me please......

    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
     开发者_StackOverflow中文版   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();
    }


That you're doing this job in a servlet class gives me the impression that your intent is to play the mp3 file whenever someone visits your website and that the visitor should hear this mp3 file.

If true, I'm sorry to say, but you're approaching this entirely wrong. Java servlet code runs in webserver machine and not in webbrowser machine. Whenever someone visits your website, this way the mp3 file would only be played at the webserver machine. This is usually a physically completely different machine which runs at the other side of the network connection and the visitor ain't ever going to hear the music.

You want to send the mp3 file raw (unmodified byte by byte) from webserver to the webbrowser without massaging it by some Java Audio API and instruct the webbrowser to play this file. The easist way is to just drop the mp3 file in public webcontent (there where your HTML/JSP files also are) and use HTML <embed> tag to embed it in your HTML/JSP file. The below example assumes the MP3 file to be in the same folder as the HTML/JSP file:

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

That's all and this is supported in practically every browser and it will show a player as well.

If the MP3 file is by business requirement stored outside public webcontent, then you may indeed need a servlet for this, but the servlet should do absolutely nothing more than getting an InputStream of it in some way and write it unmodified to the OutputStream of the HttpServletResponse the usual Java IO way. You only need to set the HTTP Content-Type header to audio/mpeg beforehand and if possible also the HTTP Content-Length header. Then point the src to the servlet's URL instead.

<embed src="mp3servlet" autostart="true"></embed>


Default java AudioInputStream does not support mp3 files. You have to plug in MP3SPI to let it decode mp3.

ALso, what do you mean by streaming? This code will play the audio file, not stream it as in internet radio streaming.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜