2

ソケット間でオーディオを渡そうとしますが、クライアントが動作を停止するよりも、クライアントで 1 回渡します。私の書き込みと送信の方法が間違っている可能性があると思います このコードに関して私を助けてください 以下は私のサーバーコードです:

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

    }




    }

以下は私のクライアントコードです:

public void run(){

    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

元のコードの方が良かった。write(buffer)ではなく、write(buffer、0、count)する必要があります。それ以外の場合は、最後の読み取りで読み取られなかった各バッファーの最後にジャンクを書き込んでいます。2番目のコードは、read()の結果を無視します。

于 2013-01-21T22:56:01.873 に答える