2013-01-21 1 views
2

메신저는 소켓간에 오디오를 전달하려고 시도하지만 클라이언트에서 멈추는 것보다 클라이언트에서 한 번 전달됩니다. 내가 길 메신저 쓰기를 생각하고 잘못 될 수있다 보내는 다음이 코드 에 대한 좀 도와주세요 나의 서버 코드 :자바 소켓 사이에서 오디오를 전달하는 방법

public void run(){ 
    try{ 
      SetInitialSettings(); 
      int bufferSize = (int) format.getSampleRate() * (int) format.getFrameSize(); 
      System.out.println("length :" +bufferSize); 
      out = new ByteArrayOutputStream(); 
      readagain=true; 
      while(record){ 
      int count=0; 

      for(int i=0;i<1000;i++) 
      { 

         if(buffer==null){ 
         buffer = new byte[bufferSize]; 
         } 
         count = line.read(buffer, 0, buffer.length); 
         if (count > 0) { 
         //out.write(buffer, 0, count); 
         //readagain=false; 
          for (int j=0;i<ser.clientReceiver.audioSender.size();j++){ 
          ser.clientReceiver.audioSender.get(i).cliOut.write("Audio".getBytes()); 
          ser.clientReceiver.audioSender.get(i).cliOut.write('\n'); 
          ser.clientReceiver.audioSender.get(i).cliOut.flush(); 
          ser.clientReceiver.audioSender.get(i).cliOut.write(buffer,0,count); 
          ser.clientReceiver.audioSender.get(i).cliOut.flush(); 
          Thread.sleep(2000); 

           } 
         } 

      }    




    } 
    } 
    catch(Exception ex) 
    { 
     System.out.println(ex.getMessage()); 

    } 




    } 

및 다음 내 클라이언트 코드 :

공공 무효 실행() {

try{ 
     //audioReceiver = new TAudioReceiver(cli); 
     //audioReceiver.start(); 
     while(true){ 

      //Thread.sleep(1000);  
      System.out.println("reading token"); 
      cmd= cli.BufferedReader().readLine(); 
      System.out.println("token :" +cmd); 
      switch (cmd) { 
       case "Msg": 
        message = cli.BufferedReader().readLine(); 
        cmd="None"; 
        break; 
      case "File": 
       GetFile(); 
       break; 
      case "Audio": 
       PlayAudio(); 
       break; 


     } 


     } 

     //reading msgs here 
    } 
    catch(Exception ex) 
    { 
     //throw new InterruptedException(ex.getMessage()); 
    } 
} 

이 은 "오디오"MSG는 서버에서 클라이언트로 받았을 때 실행할 수있는 기능이 필요하다

public void PlayAudio()throws Exception{ 

    try{ 

        cli.ServerInputStream().read(buffer); 


        audio = buffer; 
        audioIn = new ByteArrayInputStream(audio); 
        AudioFormat f = new AudioFormat(8000, 8, 1,true, true); 
        ain= new AudioInputStream(audioIn,f, audio.length/f.getFrameSize()); 
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, f); 
        try (SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info)) { 
         int bufferSize = (int) f.getSampleRate()* f.getFrameSize(); 
         buffer= new byte[bufferSize]; 
         int count; 
         while ((count = ain.read(buffer, 0, buffer.length)) != -1) { 
         if (count > 0) { 
          line.write(buffer, 0, count); 
         } 
         } 
         line.drain(); 
        } 

    } 
    catch(Exception ex) 
    { 
     System.out.println("file" + ex.getMessage()); 
    } 


} 

답변

0

원본 코드가 더 좋았습니다. 쓰기 (버퍼, 0, 카운트), 쓰기 (버퍼)하지 않아야합니다. 그렇지 않으면 마지막으로 읽을 때 읽지 않은 각 버퍼의 끝에 쓰레기를 쓰게됩니다. 두 번째 코드는 read()의 결과를 무시합니다.

+0

필자는 쓰기 (버퍼, 0 카운트)로 대체했는지 확인하십시오. 실제로는 두 번째 코드에서 오디오를 읽고 전체 버퍼를 읽으려고합니다. 내가 바꿔야하는 실수를 보여 주실 수 있습니까? 클라이언트는 chat msg, 파일 및 오디오를 받아 들일 필요가있는 하나의 수신자이기 때문에 –

+0

@ user1998498 당신은 여전히 ​​읽기 결과를 무시하고 있습니다. 클라이언트 복사 루프는 완전히 다른 코드가 아닌 서버 복사 루프의 역순이어야합니다. 필요없는 프로토콜의 모든 추가 비트를 제거하면 두 루프가 동일합니다. – EJP

+0

제발이 내 질문 좀 봐. 지금은 점점 소리 : http://stackoverflow.com/questions/14489953/receiving-same-java-sound-between-sockets –

관련 문제