2016-05-04 2 views
0

Ich bin ein Java-Voice-Chat-Programm zu machen und die serverseitige Sprachklasse wirft diesen Fehlerjavax.sound.sampled.LineUnavailableException auf Versuch zur Tonaufzeichnung

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 8 bit, mono, 1 bytes/frame, not supported. 
    at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513) 
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121) 
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:153) 
    at client.VoiceUser.run(VoiceUser.java:34) 

die Fehler auf dieser Zeile Code geworfen werden

microphone.open(audioformat); 

Code:

package client; 

import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.ArrayList; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 

public class VoiceUser extends Thread { 
    private ObjectOutputStream clientOutput; 
    private TargetDataLine microphone; 
    private ArrayList<ObjectOutputStream> vOutputArray = new ArrayList<ObjectOutputStream>(); 
    private AudioFormat audioformat; 

    public VoiceUser(Socket sv, ArrayList<ObjectOutputStream> outputArray) throws LineUnavailableException { 
     try { 
      clientOutput = new ObjectOutputStream(sv.getOutputStream()); 
      vOutputArray.equals(clientOutput); 
      vOutputArray.add(clientOutput); 
     } catch (IOException e) { 
      System.out.println("Can't create stable connection between server and client"); 
     } 
    } 
    public void run() { 
     try { 
      DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioformat); 
      microphone = (TargetDataLine)AudioSystem.getLine(info); 
      audioformat = new AudioFormat(8000.0f,8,1,true,false); 
      microphone.open(audioformat); 
      microphone.start(); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } 
     int bytesRead = 0; 
     byte[] soundData = new byte[3072]; 
     int offset = 0; 
     while(bytesRead != -1) 
     { 
      bytesRead = microphone.read(soundData, 0, soundData.length); 
      if(bytesRead >= 0) { 
       offset += bytesRead; 
       if(offset == soundData.length) { 
        send(soundData, bytesRead); 
        offset = 0; 
       } 
      } 
     } 
    } 
public void send(byte[] soundData, int bytesRead) { 
    for(ObjectOutputStream o : vOutputArray) { 
     try { 
      o.write(soundData, 0, bytesRead); 
      o.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
} 
} 
+0

Ich änderte den Ausnahmetelegramm in block-style statt inline, so dass es besser lesbar wäre. –

Antwort

0

Es sagt Ihnen, dass Linie ist nicht verfügbar. Es gibt mehrere Gründe - Ihre Soundkarte unterstützt keine Aufnahme in dem von Ihnen angegebenen Format. Sie können verschiedene Formate ausprobieren, zum Beispiel wird 22050Hz unterstützt.

Ein weiterer Grund, die Soundkarte ist bereits mit der Aufnahme beschäftigt. Unter Windows können Sie nicht gleichzeitig mit zwei Mikrofonen aufnehmen. Sie müssen Ihren Server so umgestalten, dass nur eine einzige Aufnahmesitzung möglich ist.