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

这是从服务器接收到客户端的“音频”消息时需要运行的功能

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


 }
4

1 回答 1

0

您的原始代码更好。您必须写入(缓冲区,0,计数),而不是写入(缓冲区)。否则,您将在最后一次读取未读取的每个缓冲区的末尾写入垃圾。您的第二段代码忽略了 read() 的结果。

于 2013-01-21T22:56:01.873 回答