IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Sérialisation d'un wav


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Sérialisation d'un wav
    Bonjour,
    dans le cadre d'une petite appli Android, j'ai developpé un service qui prend en parametre un tableau de byte avec Ksoap2 et qui me retourne un String.

    Le service fonctionne, mais lorsque je fait transiter un fichier audio wav, je ne suis pas capable coté serveur de le recreer.

    J'ai donc isoler dans un main, la conversion wav-->byte[] et inversement.
    Les tailles de fichiers d'entree et en sortie sont bien les memes, mais mon fichier de sortie n'est pas lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.util.Vector;
     
    import javax.sound.sampled.AudioFileFormat;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.UnsupportedAudioFileException;
     
    public class Test {
     
    	/**
             * @param args
             * @throws IOException
             * @throws UnsupportedAudioFileException
             */
    	public static void main(String[] args) throws IOException,
    			UnsupportedAudioFileException {
    		File fichier = new File("C:/Users/moi/Desktop/03.wav");
    		InputStream stream = AudioSystem.getAudioInputStream(fichier);
     
    		byte[] buf = new byte[1024];
    		ByteArrayOutputStream bos = new ByteArrayOutputStream();
    		int n;
    		while ((n = stream.read(buf, 0, buf.length)) > 0)
    			bos.write(buf, 0, n);
    		buf = bos.toByteArray();
     
    		signalMessage(buf);
    	}
     
    	public static void signalMessage(byte[] data)
    			throws UnsupportedAudioFileException, IOException {
    		File dest = new File("C:/Users/moi/Desktop/out.wav");
     
    		dest.createNewFile();
     
    		ByteArrayInputStream sourceFile = new ByteArrayInputStream(data);
    		FileOutputStream destinationFile = new FileOutputStream(dest);
     
    		byte buffer[] = new byte[1024];
    		int nbLecture;
     
    		while ((nbLecture = sourceFile.read(buffer)) != -1) {
    			destinationFile.write(buffer, 0, nbLecture);
    		}
    		destinationFile.close();
    		sourceFile.close();
     
    	}
    }
    Merci par avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, chez moi, ça produit un fichier (illisible) qui ne fait pas la même taille que le fichier de départ.

    Et c'est ce à quoi je m'attendais : pourquoi un AudioInputStream ? Pourquoi pas un FileInputStream ?
    Logiquement, on peut s'attendre à ce qu'un AudioInputStream serve à lire des trames sonores décodées, pas à recopier un fichier à l'identique. Et c'est bien ce qu'on observe ici -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui effectivement, merci d'avoir pointer l'erreur!
    Avec un FileInputStream, ca fonctionne beaucoup mieux.
    Neanmoins, le service Ksoap2 m'indique l'imposssibilité de serializé un byte[]...

    Apres quelques recherches sur le net, la solution semble l'encodage en Base64.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ss = Base64.encode(byte[] bb)
    Mais cela ralentit considerablement le traitement pour un simple wav de 10sec.
    N'etant pas chez moi, je n'ai pas le code sous les yeux mais je completerais mon post ce soir.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par cedxgx Voir le message
    Neanmoins, le service Ksoap2 m'indique l'imposssibilité de serializé un byte[]...

    Apres quelques recherches sur le net, la solution semble l'encodage en Base64.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String ss = Base64.encode(byte[] bb)
    Mais cela ralentit considerablement le traitement pour un simple wav de 10sec.
    SOAP est un protocole 100% texte. Il est mauvais pour transmettre du binaire*. C'est ainsi.
    Si c'est un problème, transmets le fichier par un autre moyen que SOAP. (Du HTTP direct devrai faire l'affaire.)

    * D'ailleurs, mon avis personnel est que SOAP est mauvais pour tout, et qu'il est très exceptionnel que SOAP soit plus avantageux qu'une approche REST+XML ad hoc. Dans ces cas exceptionnels, SOAP reste moins bon que d'autres solutions encore.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour le conseil, je vais donc regarder de ce coté.
    Je poste quand meme le code que j'ai actuellement coté client/serveur...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public static void main(String[] args) throws IOException {
    		//Encodage du wav
    		StringBuilder toto = new StringBuilder();
     
    		byte buffer[] = new byte[512 * 1024];
     
    		FileInputStream in = new FileInputStream("C:/Users/moi/Desktop/03.wav");
     
    		while ((in.read(buffer)) != -1) {
    			toto.append(Base64.encode(buffer));
    		}
     
    		in.close();
    		//Decodage du wav
    		byte[] tab = Base64.decode(toto.toString());
     
    		File destination = new File("C:/Users/moi/Desktop/result.wav");
    		destination.createNewFile();
     
    		ByteArrayInputStream sourceFile = new ByteArrayInputStream(tab);
     
    		FileOutputStream destinationFile = new FileOutputStream(destination);
     
    		byte buffer1[] = new byte[512 * 1024];
    		int nbLecture1;
     
    		while ((nbLecture1 = sourceFile.read(buffer1)) != -1) {
    			destinationFile.write(buffer1, 0, nbLecture1);
    		}
    		destinationFile.flush();
    		destinationFile.close();
    		sourceFile.close();
     
    	}

Discussions similaires

  1. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24
  2. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18
  3. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43
  4. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 14h10
  5. [Kylix] jouer un fichier wav avec kilyx
    Par JlouisI dans le forum EDI
    Réponses: 1
    Dernier message: 14/06/2002, 02h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo