2011-08-05 51 views
0

要傳輸音頻文件我已經實現了以下代碼。但是,我得到異常:在Java中從磁盤流式傳輸音頻Servlets

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

默認的Java的AudioInputStream不支持MP3文件。你必須插入MP3SPI讓它解碼MP3。

此外,流媒體是什麼意思?此代碼將播放音頻文件,而不是像在網絡電臺流中一樣流式傳輸。

3

你在一個servlet類中做這個工作給我的印象是,你的意圖是當有人訪問你的網站時播放mp3文件,並且訪問者應該聽到這個mp3文件。

如果屬實,我很抱歉地說,但你接近完全錯誤。 Java servlet代碼在web服務器機器中運行,而不是在webbrowser機器中運行。每當有人訪問你的網站時,這種方式只能在web服務器上播放mp3文件。這通常是一個物理上完全不同的機器,它運行在網絡連接的另一端,訪客不會聽到音樂。

您希望將未經修改的mp3文件從網絡服務器發送到網絡瀏覽器,而無需通過某些Java音頻API進行按摩並指示網絡瀏覽器播放此文件。最簡單的方法是將mp3文件放在公共webcontent(也就是HTML/JSP文件所在的位置),然後使用HTML標記將其嵌入到HTML/JSP文件中。下面的例子假設MP3文件是在同一文件夾中的HTML/JSP文件:

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

這一切,這在幾乎每一個瀏覽器的支持,它會顯示一個播放器以及。

如果MP3文件是存儲公共web內容之外的業務需求,那麼你可能確實需要這一個servlet,而該servlet應該什麼都不做比得到它的一個InputStream以某種方式把它寫未修改的多HttpServletResponse的通常的Java IO方式的OutputStream。您只需事先將HTTP Content-Type標頭設置爲audio/mpeg,並且如果可能的話還需要HTTP Content-Length標頭。然後將src指向servlet的URL。

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