2010-01-18 3 views
3

문제가 있습니다. MediaLocator를 마이크 입력으로 설정 한 다음 Player를 생성했습니다. 마이크에서 해당 사운드를 가져 와서 일부 저품질 스트림으로 인코딩하고 UDP를 통해 데이터 그램 패킷으로 보내야합니다. 나 송신자에서이 플레이어를 듣고있다, 나는 수신기 클래스를 실행할 때 발생자바에서 UDP를 통해 오디오 스트림을 보내는 방법은 무엇입니까?

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(); 
} 

}

그리고 유일한 : 여기에 내가 온라인의 대부분을 발견하고 내 응용 프로그램에 적응 코드입니다 수업. 그리고 TargetDataLine과 Player 사이의 연결을 볼 수 없습니다. 기본적으로 사운드 양식 플레이어를 가져와 어떻게 든 그것을 바이트 []로 변환해야하므로 데이터 그램으로 보낼 수 있습니다. 아이디어가 있으십니까? 모든 것이 작동하는 한 허용됩니다.

+0

플레이어 대신 싱크를 사용해야합니다 ... –

답변

2

여기 플레이어 클래스가 무엇이든간에 javax.sound.sampled의 클래스를 사용하고 싶지 않습니다. 내가 말할 수있는 한, Player는 사운드를 재생하고 컨텐츠에 액세스하지 않는 것입니다.

테스트하지는 않았지만 작성중인 TargetDataLine에서 .read를 사용하여 버퍼를 채운 다음 버퍼를 다른 호스트로 보냅니다.

+0

.read (buffer, 0, buffer.size)는 주어진 버퍼를 채 웁니다? 그것을 시도합니다, 감사합니다 :) –

관련 문제