java - java Servlet 中磁盘的音频流

标签 java servlets audio-streaming

为了流式传输音频文件,我实现了以下代码。但我遇到了异常:

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();
    }

最佳答案

您在 servlet 类中完成这项工作给我的印象是,您的意图是每当有人访问您的网站时就播放 mp3 文件,并且访问者应该听到这个 mp3 文件。

如果这是真的,我很遗憾地说,但你的做法完全错误。 Java servlet 代码在网络服务器计算机中运行,而不是在网络浏览器计算机中运行。每当有人访问您的网站时,这样 mp3 文件只会在网络服务器计算机上播放。这通常是一台物理上完全不同的机器,运行在网络连接的另一端,访问者永远不会听到音乐。

您想要将 mp3 文件原始(未逐字节修改)从网​​络服务器发送到网络浏览器,而不通过某些 Java 音频 API 对其进行处理,并指示网络浏览器播放该文件。最简单的方法是将 mp3 文件拖放到公共(public) web 内容中(您的 HTML/JSP 文件也在那里)并使用 HTML <embed>标记将其嵌入到您的 HTML/JSP 文件中。下面的示例假设 MP3 文件与 HTML/JSP 文件位于同一文件夹中:

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

仅此而已,几乎所有浏览器都支持此功能,并且它也会显示播放器。

如果 MP3 文件是根据业务要求存储在公共(public) Web 内容之外的,那么您可能确实需要一个 servlet,但该 servlet 应该只获取一个 InputStream 。以某种方式将其写入并未经修改地写入 OutputStream HttpServletResponse的通常的 Java IO 方式。只需要设置HTTP Content-Type标题为 audio/mpeg事先,如果可能的话,还可以使用 HTTP Content-Length header 。然后点src改为 servlet 的 URL。

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

关于java - java Servlet 中磁盘的音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953913/

相关文章:

java - 如何让Apache Camel中的事件驱动消费者删除消费过的消息?

java - Android arraylist 大量字符串对象

java - 在android中显示当前音乐播放信息

audio-streaming - 将PulseAudio流传输到文件(可能使用GStreamer)

java - Exoplayer 音频未在后台服务中播放

java - 正则表达式从文本java验证意大利名字

java - 如何有效地形成后缀数组?

java - 使用 Servlet、JSB 和 JavaBeans (MVC)

java - 从下拉列表中选择一种颜色并将该颜色存储在 cookie 中。

java - ServletContext - 应用程序范围的 session 对象返回 null