Java Enregistrement de Mic de Tableau d'Octets et de Jouer un son

Je veux faire un live chat vocal programme en Java, mais je ne sais rien à propos de l'enregistrement/lecture audio en Java, donc, avec l'aide de Google, je pense que j'ai été en mesure d'enregistrer à partir de mon micro à un tableau d'octets avec les éléments suivants:

AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);
TargetDataLine microphone;
try{
    microphone = AudioSystem.getTargetDataLine(format);

    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
    microphone = (TargetDataLine)AudioSystem.getLine(info);
    microphone.open(format);

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int numBytesRead;
    byte[] data = new byte[microphone.getBufferSize()/5];
    microphone.start();

    int bytesRead =0;

    try{
        while(bytesRead<100000){ //Just so I can test if recording my mic works...
            numBytesRead = microphone.read(data, 0, data.length);
            bytesRead = bytesRead + numBytesRead;
        //   System.out.println(bytesRead);
            out.write(data, 0, numBytesRead);
        }
    catch(Exception e){
        e.printStackTrace();
    }
    microphone.close();

catch(LineUnavailibleException e){
    e.printStackTrace();
}

Alors maintenant, à ma connaissance, si je l'appelle.toByteArray();, je devrais avoir obtenu un tableau d'octets du son, j'ai juste enregistré à partir de mon micro. (Je n'ai pas d'erreur d'exécution de la ci-dessus, mais n'ont aucun moyen de prouver si elle a effectivement enregistré parce que je ne veux pas de sortie pour un fichier et de ne pas le faire)

Maintenant, si ce qui précède est correct, alors ci-dessous est là que je rencontre mon problème:
Je veux maintenant jouer du tableau d'octets, je viens de créer... (Dans mon programme, je l'ai envoyé les octets à mon "programme de réception" à travers une socket Java que j'ai déjà été capable de le faire, mais pour l'instant je veux juste faire un petit programme qui enregistre les mic et les lit). Afin de jouer le son de l'information à partir du tableau d'octets, j'ai suivi ceci: http://www.wikijava.org/wiki/Play_a_wave_sound_in_Java
Et est venu avec ce qui suit: (c'est situé juste après le microphone.close() à partir de ci-dessus)

try{
    DataLine.Info info2 = DataLine.Info(SourceDataLine.class, format);
    SourceDataLine dataLine = (SourceDataLine)AudioSystem.getLine(info2);
    int bufferSize = 2200;
    soundLine.open(format, bufferSize);
    soundLine.start();
    AudioInputStream audioInputStream = null;

    InputStream input = new ByteArrayInputStream(out.toByteArray());
    audioInputStream = AudioSystem.getAudioInputStream(input);

    ...

Le reste est assez bien copier collé de l'playSound.java à partir de ce lien:
http://www.wikijava.org/wiki/Play_a_wave_sound_in_Java

Lorsque j'exécute le code ci-dessus... L'enregistrement semble fonctionner très bien, mais j'obtiens l'erreur suivante:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream

pour cette ligne audioInputStream = AudioSystem.getAudioInputStream(input);

De mes connaissances limitées, je suppose que c'est parce que j'ai un peu foiré la méthode d'enregistrement, j'ai besoin d'une sorte de "Audio Format d'en-Tête?" https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ (Je suppose que je n'aurais pas besoin de quelque chose comme ça, parce que je n'ai jamais enregistré dans un fichier et juste gardé tout comme un tableau d'octets), ou j'ai juste complètement mal comment java AudioInputStream lit et traite les données...

C'est ma première fois de travailler avec n'importe quel son les choses en Java, donc je m'excuse si je suis complètement de l'incompréhension et le dépeçage de ce code (oui, je sais, le code est assez mauvais et non-syndiqués, mais je veux juste le faire fonctionner)... j'ai essayé plusieurs recherches sur Google/StackOverflow, et a été en mesure de trouver une question très semblable:

java tableau d'octets à lire le son

mais il a également été sans réponse (la seule réponse était de l'enregistrer dans un fichier, mais ce que nous voulons tous les deux en streaming directement comme un tableau d'octets, sans jamais devenir un fichier)

Ce que je sais:

Audio peut être enregistré à l'aide d'un TargetDataLine, et l'enregistrement du microphone, qui peut être délivrée à un Tableau d'Octets à l'aide d'un ByteArrayOutputStream

Audio peuvent être enregistrées dans un fichier et joué à l'aide d'un AudioInputStream pour lire le fichier et un SourceDataLine de lire les données.

Si je voulais écrire un fichier, je peux utiliser le système de Sonorisation.écrire(nouveau AudioInputStream(microphone), AudioFileFormat.Type.La VAGUE, le nouveau Fichier("enregistrement.wav"); //j'ai testé en remplaçant la boucle while avec cette ligne et il a enregistré fine (sauf qu'il ne s'arrêterait jamais, donc j'ai dû mettre fin manuellement), mais je n'en veux pas, parce que la sortie à un fichier signifie qu'il sera impossible de l'envoyer sur une prise secteur à l'autre côté en temps réel.

Ce que je ne sais pas /Ma Question:

Comment enregistrer et de diffuser de l'audio enregistré à partir d'un micro à un autre ordinateur qui peut être joué avec peu de retard que possible (un peu comme un chat vocal similaire à Skype) avec Java.

Merci d'avance pour toute aide ou quelqu'un qui peut me pointer dans la bonne direction. Aussi, si quelqu'un connait une méthode plus simple alors s'il vous plaît dites-moi.

stackoverflow.com/questions/14187667/...
J'ai effectivement vu cette Question, mais parce que le code qu'ils avaient était vraiment petite, je n'avais aucune idée de quelle technique ils ont utilisé pour afficher. Par exemple, je ne sais pas ce que la ligne, ou de la mémoire tampon sont utilisés pour/ce qu'ils sont. Pouvez-vous expliquer ce que la ligne est/comment lancer, et ce que le ByteBuffer?
Je peux donner une réponse plus détaillée plus tard, mais pour l'instant découvrez les java tutoriel sur audio I/O (il y a plusieurs pages) docs.oracle.com/javase/tutorial/sound/accessing.html
J'ai déjà vu le tuto mais je ne écrémé grâce à elle, la première fois, Mal être sûr de vérifier en détail dès que possible, mais nous voulons être votre réponse. Merci.

OriginalL'auteur XQEWR | 2014-09-11