2

クライアントとサーバーのアプリケーションがあります。サーバーはオーディオストリームを要求し、クライアントは適切に処理します。

クライアントは、AudioFormat(注:設定は両端で同じです)とTargetDataLineのセットアップに進みます。次に、ByteArrayOutputStreamを使用してデータをSocket出力ストリームに書き込みます。

サーバーはデータを受信し、スレッド化された方法で読み取ります。各バッファの読み取り中に、AudioInputStreamに保存されます。このメソッドは、サウンドの再生に進むためにスレッド化および同期化されたplaySoundメソッドに渡されます。

playSoundメソッドを非スレッド化すると、うまく機能しますが、わずかにグリッチが発生します。また、再生サウンドをスレッド化しないと、サウンドフレームが詰まる可能性があることもわかっています。助けていただければ幸いです。このオーディオストリームをより効率的かつ高速にする方法も歓迎します。

クライアント:

private void CaptureAudio()はCommandException{をスローします

    Socket session = new Socket(host_, port_); 
        try {
            final AudioFormat format = getFormat();
            DataLine.Info info = new DataLine.Info(
            TargetDataLine.class, format);
            final TargetDataLine line = (TargetDataLine)
            AudioSystem.getLine(info);
            line.open(format);
            line.start();

            int bufferSize = (int)format.getSampleRate() * format.getFrameSize();
            byte buffer[] = new byte[bufferSize];
            running = true;
                try {         
                    while (running) {

                            int count = line.read(buffer, 0, buffer.length);
                            if (count > 0) {
                               BufferedOutputStream out_ = null;
                               out_ = new BufferedOutputStream(socket_.getOutputStream());
                               out_.write(buffer, 0, count);
                               out_.flush();

                              }    
                    }
                    out_.close();
                    line.close();
                } catch (IOException e) {
                    throw new CommandException("I/O problems: " + e,Command.TRANSFER_ERROR);
                } 
        } catch (LineUnavailableException e) {
            throw new CommandException("Line unavailable: " + e,Command.ERROR);
        }
    else {
        throw new CommandException("Unable to Connect to Server",Command.CONNECTION_ERROR);
    }
}

private AudioFormat getFormat() {
    float sampleRate = 16000;
    int sampleSizeInBits = 16;
    int channels = 2;
    boolean signed = true;
    boolean bigEndian = true;
    return new AudioFormat(sampleRate,sampleSizeInBits, channels, signed, bigEndian);

}

サーバー:public void readSocket(final Socket socket){new Thread(){

        @Override
        public void run() {
            InputStream input;
            try {
                input = socket.getInputStream();

                final AudioFormat format = getFormat();
                int bufferSize = (int)format.getSampleRate() * format.getFrameSize();
                byte buffer[] = new byte[bufferSize];
                int bytesRead;
                while (((bytesRead = input.read(buffer, 0, bufferSize)) != -1 ) ) {
                    if (bytesRead > 0) {
                        play(new AudioInputStream(input, format, buffer.length / format.getFrameSize()));
                    }
                }
                socket.close();
            } catch (Exception ex) {

            }


        }
    }.start();

}


private AudioFormat getFormat() {
  float sampleRate = 16000;
  int sampleSizeInBits = 16;
  int channels = 2;
  boolean signed = true;
  boolean bigEndian = true;
  return new AudioFormat(sampleRate, 
    sampleSizeInBits, channels, signed, bigEndian);
}

プライベート同期voidplay(final AudioInputStream ais){new Thread(){

        @Override
        public void run() {
            try {
                final AudioFormat format = getFormat();
                DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
                SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
                line.open(format);
                line.start();

                int bufferSize = (int) format.getSampleRate() 
                  * format.getFrameSize();
                byte buffer[] = new byte[bufferSize];

                int count;
                while ((count = ais.read(buffer, 0, buffer.length)) != -1) {
                  if (count > 0) {
                    line.write(buffer, 0, count);
                  }
                }
                line.drain();
                line.close();
                ais.close();
            } catch (LineUnavailableException ex) {
            } catch (IOException ex) {

            }
        }
    }.start();

}

4

0 に答える 0