2010-01-18 7 views
3

J'ai un problème, j'ai réglé MediaLocator sur l'entrée micro, puis j'ai créé Player. J'ai besoin d'extraire ce son du microphone, de l'encoder dans un flux de qualité inférieure et de l'envoyer sous forme de paquet de datagramme via UDP. Voici le code, je l'ai trouvé la plupart d'entre en ligne et adapté à mon application:Comment envoyer un flux audio via UDP dans Java?

public class AudioSender extends Thread { 

private MediaLocator ml = new MediaLocator("javasound://44100"); 
private DatagramSocket socket; 
private boolean transmitting; 
private Player player; 
TargetDataLine mic; 
byte[] buffer; 
private AudioFormat format; 


private DatagramSocket datagramSocket(){ 
    try { 
     return new DatagramSocket(); 
    } catch (SocketException ex) { 
     return null; 
    } 
} 

private void startMic() { 
    try { 
     format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 16, 2, 4, 8000.0F, true); 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
     mic = (TargetDataLine) AudioSystem.getLine(info); 
     mic.open(format); 
     mic.start(); 
     buffer = new byte[1024]; 
    } catch (LineUnavailableException ex) { 
     Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private Player createPlayer() { 
    try { 
     return Manager.createRealizedPlayer(ml); 
    } catch (IOException ex) { 
     return null; 
    } catch (NoPlayerException ex) { 
     return null; 
    } catch (CannotRealizeException ex) { 
     return null; 
    } 
} 

private void send() { 
    try { 
     mic.read(buffer, 0, 1024); 
     DatagramPacket packet = 
      new DatagramPacket(
       buffer, buffer.length, InetAddress.getByName(Util.getRemoteIP()), 91); 
     socket.send(packet); 
    } catch (IOException ex) { 
     Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void run() { 
    player = createPlayer(); 
    player.start(); 
    socket = datagramSocket(); 
    transmitting = true; 
    startMic(); 
    while (transmitting) { 
     send(); 
    } 
} 

public static void main(String[] args) { 
    AudioSender as = new AudioSender(); 
    as.start(); 
} 

}

Et seule chose qui arrive quand je lance la classe de récepteur, moi est entendu ce joueur de l'expéditeur classe. Et je ne peux pas sembler voir la connexion entre TargetDataLine et Player. Fondamentalement, j'ai besoin d'obtenir le lecteur de forme sonore, et en quelque sorte le convertir en octets [], donc je peux l'envoyer en tant que datagramme. Des idées? Tout est acceptable, tant que cela fonctionne :)

+0

Un évier doit être utilisé à la place d'un lecteur ... –

Répondre

2

Vous ne faites pas ce que la classe Player ici, vous voulez utiliser les classes javax.sound.sampled. Autant que je sache, le lecteur joue un son sans avoir accès à son contenu.

Je n'ai pas testé cela, mais essayez d'utiliser .read sur la TargetDataLine que vous créez pour remplir un tampon, puis d'envoyer le tampon à l'autre hôte.

+0

Donc, .read (buffer, 0, buffer.size) remplit le buffer donné? Je vais essayer ça, merci :) –

Questions connexes