Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : java UDP audio [ Divers / Général ] (eikichi)

mercredi 25 avril 2007 à 12:37:19 | java UDP audio

eikichi

Membre Club
Bonjour a tous,
Je cherche à transférer un flux audio en utilisant des sockets en UDP.
Le flux est déjà subdivisé en plusieurs petits paquets UDP que j'envoie en permanence du Client vers le Serveur, les données envoyées sont de type byte[].
Cependant je me demande si les objets Datagrampacket peuvent être identifiés par un numéro de séquence (méthode renvoyant le num du paquet)  ou si je dois moi-même donner un numéro de séquence (en byte toujours) pour chaque paquet transmis, dans ce cas comment puis-je fusionner deux arrays byte[] (un pour le numéro de séquence et un pour les données audio) dans un seul que je transmettrai dans le Datagrampacket?

Merci d'avance pour vos réponses.

Si jamais voilà le bout de code pour l'applic client:

tout se passe dans la classe audioInputBlockReady qui reçoit ce bout de flux audio (inputbuffer) et qui le convertit en paquet UDP.



public void audioInputBlockReady(AudioThread audiothread, byte[] inputbuffer){
        /*
         * TODO
         *
         * When the AudioThread is running, this method is periodically called
         * by the AudioThread to indicate that new block of audio data is ready.
         * Note that this method is actually executed within the AudioThread
         * thread - don't forget to synchronize your objects.
         *
         * Imagine you are using audio block of 800 bytes (=400 samples). Since
         * we are sampling at 8000 samples per second (given by AudioThread),
         * such a block would correspond to 50 ms. Hence, this method would be
         * called 20 times per second with an "inputbuffer" containing 800
         * bytes.
         *
         * In this method you may process, package and send these samples. Note
         * that you should not use the inputbuffer object outside of this
         * function. If you want to send its contents in a UDP datagram, for
         * instance, you should rather copy the buffer to a new buffer, i.e.
         *
         * System.arraycopy(inputbuffer, 0, udpdatagram.getData(), ...,
         * inputbuffer.length);
         */
        InetAddress  IPAddress = null;
        //byte[] sequenceNumber = new byte[2];
       
       
       
        try {
            clientSocket = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
       
        try {
            IPAddress = InetAddress.getByName("host");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
       
        byte[] sendData = new byte[inputbuffer.length]; //data ready to send
         System.arraycopy(inputbuffer, 0, sendData, 0, inputbuffer.length);
         /*Question: est ce que je dois faire le seqNumber moi-même ou est-ce
          * que c'est déjà compris dans l'objet Socket??*/
        byte[] receiveData = new byte[1024];
        DatagramPacket sendPacket = new DatagramPacket(sendData,
                sendData.length, IPAddress, portNumber);
        try {
            clientSocket.send(sendPacket);
            countSentPackets++;
        } catch (IOException e) {
           
            e.printStackTrace();
        }
       
        DatagramPacket receivePacket =
            new DatagramPacket(receiveData, receiveData.length);
       
        try {
            clientSocket.receive(receivePacket);
        } catch (IOException e) {
            e.printStackTrace();
        }
        LogSink.defaultLog.println("New input block of " + String.valueOf(inputbuffer.length) + " bytes available!");
   
    }

mercredi 25 avril 2007 à 12:54:58 | Re : java UDP audio

Twinuts

Membre Club Administrateur CodeS-SourceS

Salut,

si ton but c'est d'envoyer l'audio en UDP tu peux te baser sur RTP qui est fait pour et ajouter le RTP header soit :

(ici je ne gère que les formats audio alaw et ulaw)


public final class RTPHeader {
    private short            sequenceNum   = 0x0;
    private int                timeStamp         = 0x0;
    private int                syncSourceId     = 0x0;
    private byte[]           rtpHeader          = null;
    private byte             version               = (byte) -128;
    private byte             padding              = 0;
    private byte             extention            = 0;
    private byte             contribute           = 0;
    private byte             payload               = 0;
    private byte             marker                = 0;

    public RTPHeader() {
        Random r = new Random();
        this.sequenceNum = 0x0;
        this.timeStamp = 0x0;
        this.syncSourceId = r.nextInt();
    }

    public byte[] getHeader(byte[] voiceData, boolean alaw) {
        rtpHeader = new byte[12];
        if (alaw)
                payload = 8;
        else
                payload = 0;
        rtpHeader[0] = (byte) (version | padding | extention | contribute);
        rtpHeader[1] = (byte) (marker | payload);
        rtpHeader[2] = (byte) (sequenceNum >> 8);
        rtpHeader[3] = (byte) (sequenceNum >> 0);
        rtpHeader[4] = (byte) (timeStamp >> 24);
        rtpHeader[5] = (byte) (timeStamp >> 16);
        rtpHeader[6] = (byte) (timeStamp >> 8);
        rtpHeader[7] = (byte) (timeStamp >> 0);
        rtpHeader[8] = (byte) (syncSourceId >> 24);
        rtpHeader[9] = (byte) (syncSourceId >> 16);
        rtpHeader[10] = (byte) (syncSourceId >> 8);
        rtpHeader[11] = (byte) (syncSourceId >> 0);
        this.sequenceNum++;
        this.timeStamp += voiceData.length;
       //concaténation de l'entete et de la voix
        ByteArrayOutputStream out = new ByteArrayOutputStream(
                voiceData.length + 12);
        out.write(rtpHeader, 0, 12);
        out.write(voiceData, 0, voiceData.length);
        return out.toByteArray();
    }
}

pour le reste il te faut changer ton code et envoyer des paquets régulier soit :
toutes les :
    10 ms la voix fait 80 octets + 12 octets de header soit un paquet de 92 octets
    20 ms la voix fait 160 octets + 12 octets de header soit un paquet de 172 octets
    30 ms la voix fait 240 octets + 12 octets de header soit un paquet de 252 octets

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

WORA

mercredi 25 avril 2007 à 14:41:37 | Re : java UDP audio

eikichi

Membre Club
Merci pour le conseil ça paraît plus propre qu'avec la méthode classique, mais malheureusement on m'impose les Sockets, le prog sera une sorte de Skype-like. Mais la fin de ton listing va beaucoup me servir, au fait ça me fait venir à une autre question: un Datagrampacket c'est juste un tableau de bytes en fait rien de plus donc si je veux rajouter des en-têtes genre numero de sequence, ip source/destination, ports, etc... c'est à moi de les implémenter?

mercredi 25 avril 2007 à 15:18:39 | Re : java UDP audio

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

RTP reste sur UDP

Concernant ta questrion, oui tu dois mettre toi meme le CSEQ, pour ce qui est de l'ip src/dest et des port c'est dans la couche IP donc tu n'as pas à les rajouter.

Pour ce qui et de skype il passe la voix sur RTP.




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

WORA

jeudi 26 avril 2007 à 15:51:47 | Re : java UDP audio

couco

Merci ça va m'eclaierer


 couco



Cette discussion est classé dans : audio, byte, udp, inputbuffer, datagrampacket


Répondre à ce message

Sujets en rapport avec ce message

[RESEAU-UDP] petite question sur les DatagramPacket [ par nesk01 ] slt,voila j sui en train d'ecrire un petit prog java pour essayer de "spoofer" mon serveur DNS... rien de super utile mais interessant pour comprendre Transfert d image par UDP [ par sebmar ] Je souhaite transferer une image via une connexion udp mais à l'arrive chez le client il m'est impossible de recréer l'image qui est transforme en byt Problème de connexion avec UDP [ par patbloup ] Voilà je souhaite me faire un client/serveur UDP, rien de plus simple!!! Mais voilà je trouve pas mal de source sur le Web ou les Exceptions du à la c cast string[]->byte[]??? [ par javateux ] salu, pb de cast cette fois ci...String[] colName = null;...Byte [] d = (Byte)colName;Et aussi : jaimerai repondre Un gd merci a ceux qui m'apportent je n'arrive pas a utiliser MulticastSocket [ par dragon80 ] j'ai ecrit ce petit programme qui utilise le multicastsocket mais il n'a pu fonctionnermeriç try{ String msg = "Hello"; InetAddress group = Inet CONVERTIR UN BYTE EN 8 BOOLEAN [ par Egalon ] Bonjour à tous,voilà, mon problème est dans le titre, c'est très simple mais ca marche pas....par ex: un int = 170, en base 2, c lire un fichier audio [ par bidules ] bonjour,j'aimerais lire un fichier audio dans un programme java et non dans une applet. Je sais que pour les applet il y a AudioClip mais pour un pgrm audio-video MPEG4 [ par tsora ] Bonjour,j´ai besoin de savoir urgement commet je peux utiliser les codecs pour convertir un video en MPEG4, et quels sont les codecs a utiliser...tout Audio en java [ par bouchti ] Bonjour ,comment lancer un ficher audio(beep)en java sans passer par les applets.Càd y'a t'il une fonction qui prend le non du fichier en paramètre et Convertir une chaine String en tableau de byte [ par JuS ] Bonjour,Je cherche à convertir une chaine de caractere String en un tableau de byte pour pouvoir correspondre en client/serveur à l'aide de sockets.Vo


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.