Java Sound

Résolu/Fermé
cs_jbond008 Messages postés 2 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 24 mai 2007 - 11 mai 2007 à 15:08
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 2 juil. 2007 à 00:24
Bonjour,

Je souhaite lire dans mon application Java un flux de données binaires (généré octet par octet par l'application).
Je connais à l'avance le format utilisé : A law ou mu law.
Dans le flux binaire, il est possible que certains octets soient erronés ou soit inséré au mauvais endroit; dans ce cas la je veux quand même les lire (même si on entend un crépitement).

Savez vous comment implémenter une lecture d'un flux binaire (octet par octet) avec Java sound.?
Suis-je obligé d'envoyer le flux trame par trame. Ou bien est il possible de lire uniquement 1 octet ?

J'ai fait le tour des tutoriaux / forums  et je n'ai pas trouvé mon bonheur, si quelqu'un a une idée je suis preneur.

Merci d'avance

4 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 mai 2007 à 15:43
Salut,

oriente toi du codé des protocoles RTP/RTCP pour la gestion de tes paquets (tu te prendras moins la tete :P)

pour faire ce que tu veux tu as 2 solutions :
    1 - utiliser JMF
    2 - le coder toi même (voir exemple ci-dessous)

pour ce qui est de cracher le flux rtp en G711 (alaw ou µlaw) tu peux faire comme suit :

(cet exemple est basé sur rtp et n'est en aucun cas une classe ou méthode fini (je posterai peut-etre un jour le code complet pour reçevoir et emettre les paquets)

int datalenth = 160;
...
//buffer reçu (alaw/µulaw)
byte[] buffer = new byte[datalenth+12];
//buffer pcm pour la carte son
byte[] linearBuffer = new byte[datalenth*2];
//audio stream sur le G711
AudioInputStream codecStream = null;
//audio stream sur le pcm
AudioInputStream linearStream = null;

//ce qui va etre lu
ByteArrayInputStream byteArrayInputStream = null;
//paquet reçu
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
//format d'entrée (G711)
AudioFormat codecFormat = null;
if(alaw)
    codecFormat = new AudioFormat(AudioFormat.Encoding.ALAW, 8000, 8, 1, 1, 8000, false);
else//µlaw
    codecFormat = new AudioFormat(AudioFormat.Encoding.ULAW, 8000, 8, 1, 1, 8000, false);
//format PCM
AudioFormat linearFormat = new AudioFormat(8000, 16, 1, true, false);

//récupération de l'objet qui va permettre l'ecriture dans la carte son
sourceDataLine = (SourceDataLine) AudioSystem.getSourceDataLine(linearFormat);
....
//ensuite dans la méthode run
//ouverture                             

sourceDataLine.open();

//démarrage

sourceDataLine.start();
while (!end) {
    try {
        //le socket UDP ouvert avec le distant
        socket.receive(packet);
        //récupération du paquet avec un saut de l'entete RTP
        byteArrayInputStream = new ByteArrayInputStream(packet.getData(), 12, buffer.length-1);
        //stack le buffer G711 dans le flux audio pour la convertion
        codecStream = new AudioInputStream(byteArrayInputStream, codecFormat, datalenth);
        //convertion du flux G711-PCM
        linearStream = AudioSystem.getAudioInputStream(linearFormat, codecStream);
        //stock le flux dans le buffer
        linearStream.read(linearBuffer, 0, linearBuffer.length);
        //ecriture du flux dans la carte son
        sourceDataLine.write(linearBuffer, 0, linearBuffer.length);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Libère les ressource sur la carte son
sourceDataLine.stop();
sourceDataLine.close();

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
3
cs_jbond008 Messages postés 2 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 24 mai 2007
24 mai 2007 à 17:58
Merci pour ton post. C'est exactement ce qu'il me fallait.
0
amairi80 Messages postés 1 Date d'inscription lundi 5 février 2007 Statut Membre Dernière intervention 2 juillet 2007
2 juil. 2007 à 00:14
bonjour
svp je besoin d aide je de faire un petit projet qui lecteure
et j utilise  API de jax.sound.sampled or que j ai de mal de comprendre
pouver m aider ou me donner totirial svp
et merci a tt le monde
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
2 juil. 2007 à 00:24
Salut,

1 - merci de poser une question sur un nouveau poste et non polluer celui d'un autre.
2 - Merci de faire un effort lors de la redaction d'un message et de te forcer à construire des phrases complètes afin que l'on puisse te comprendre parce que la... (on ne demande d'être irréprochable en français mais un minimum...)

pour l'heure sujet clos.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Rejoignez-nous