2011-08-05 5 views
0

Pour diffuser un fichier audio, j'ai implémenté le code suivant. Mais je reçois Exception:Diffusion audio à partir du disque dans les servlets Java

javax.sound.sampled.UnsupportedAudioFileException: n'a pas pu obtenir le flux d'entrée audio à partir du fichier d'entrée à javax.sound.sampled.AudioSystem.getAudioInputStream (AudioSystem.java:1170)

peut me aider ...... s'il vous plaît

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

Répondre

2

Par défaut java AudioInputStream ne supporte pas les fichiers mp3. Vous devez brancher MP3SPI pour le laisser décoder le mp3.

ALSO, que voulez-vous dire par "streaming"? Ce code va lire le fichier audio, pas le diffuser comme dans le streaming radio internet.

3

Ce que vous faites ce travail dans une classe de servlet me donne l'impression que votre intention est de lire le fichier mp3 chaque fois que quelqu'un visite votre site Web et que le visiteur doit entendre ce fichier mp3.

Si cela est vrai, je suis désolé de le dire, mais vous vous approchez de ce tout à fait tort. Le code du servlet Java s'exécute dans la machine du serveur Web et non dans la machine du navigateur Web. Chaque fois que quelqu'un visite votre site Web, de cette façon, le fichier mp3 ne serait joué que sur la machine du serveur Web. Il s'agit généralement d'une machine physiquement complètement différente qui fonctionne de l'autre côté de la connexion réseau et le visiteur n'entend jamais la musique.

Vous souhaitez envoyer le fichier mp3 brut (octet par octet non modifié) du serveur Web au navigateur Web sans le masser par une API Java Audio et demander au navigateur Web de lire ce fichier. La manière la plus simple est de simplement déposer le fichier mp3 dans le contenu web public (là où se trouvent également vos fichiers HTML/JSP) et d'utiliser la balise HTML <embed> pour l'intégrer dans votre fichier HTML/JSP. L'exemple ci-dessous suppose que le fichier MP3 être dans le même dossier que le fichier HTML/JSP:

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

C'est tout ce qui est pris en charge dans pratiquement tous les navigateurs et il affichera un joueur aussi bien. Si le fichier MP3 doit être stocké en dehors du contenu web public, vous pouvez en effet avoir besoin d'une servlet, mais le servlet ne doit absolument rien faire d'autre que d'en obtenir un InputStream d'une manière ou d'une autre et de l'écrire sans modification. OutputStream du HttpServletResponse le moyen habituel Java IO. Il vous suffit de définir l'en-tête HTTP Content-Type au préalable et, si possible, l'en-tête HTTP Content-Length. Puis pointez le src à l'URL de la servlet à la place.

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