2012-02-02 24 views
1

5秒間の音程を記録し、処理のために送信するソフトウェアがあります。それは無限ループで実行され、次のようになります。私はそうrecorder.getInputStream()リターンをnullので記録の終了後に行Thread.sleep(300);を追加する必要がありました上記のコードでjavaオーディオ録音

while (true) { 
    System.out.println("recording.."); 
    recorder.start(); 
    Thread.sleep(5000); 
    recorder.stop(); 
    Thread.sleep(300); 
    System.out.println("recording finished"); 

    data = toolkit.readInputStream(recorder.getInputStream()); 

    pkt = create(data); 

    outport.send(pkt); 
} 

を。なぜそれが起こっているのですか?遅れが必要ないように変更する方法はありますか?

レコーダーコード:

public class SoundRecorder implements Runnable{ 


     final int bufSize = 16384; 

     AudioInputStream audioInputStream; 
     String errStr; 
     double duration, seconds; 
     File file; 

    public void start() { 
       errStr = null; 
       thread = new Thread(this); 
       thread.setName("Capture"); 
       thread.start(); 
      } 

      public void stop() { 
       thread = null; 
      } 

private void shutDown(String message) { 
      if ((errStr = message) != null && thread != null) { 
       thread = null; 
       System.err.println(errStr); 

      } 
     } 


     public void run() { 

       duration = 0; 
       audioInputStream = null; 


       // define the required attributes for our line, 
       // and make sure a compatible line is supported. 

       AudioFormat format = getFormat(); 
       DataLine.Info info = new DataLine.Info(TargetDataLine.class, 
         format); 

       if (!AudioSystem.isLineSupported(info)) { 
        shutDown("Line matching " + info + " not supported."); 
        return; 
       } 

       // get and open the target data line for capture. 

       try { 
        line = (TargetDataLine) AudioSystem.getLine(info); 
        line.open(format, line.getBufferSize()); 
       } catch (LineUnavailableException ex) { 
        shutDown("Unable to open the line: " + ex); 
        return; 
       } catch (SecurityException ex) { 
        shutDown(ex.toString()); 

        return; 
       } catch (Exception ex) { 
        shutDown(ex.toString()); 
        return; 
       } 

       // play back the captured audio data 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       int frameSizeInBytes = format.getFrameSize(); 
       int bufferLengthInFrames = line.getBufferSize()/8; 
       int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; 
       byte[] data = new byte[bufferLengthInBytes]; 
       int numBytesRead; 

       line.start(); 

       while (thread != null) { 
        if ((numBytesRead = line.read(data, 0, bufferLengthInBytes)) == -1) { 
         break; 
        } 
        out.write(data, 0, numBytesRead); 
       } 

       // we reached the end of the stream. stop and close the line. 
       line.stop(); 
       line.close(); 
       line = null; 

       // stop and close the output stream 
       try { 
        out.flush(); 
        out.close(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

       // load bytes into the audio input stream for playback 

       byte audioBytes[] = out.toByteArray(); 
       ByteArrayInputStream bais = new ByteArrayInputStream(audioBytes); 
       audioInputStream = new AudioInputStream(bais, format, audioBytes.length/frameSizeInBytes); 

       long milliseconds = (long) ((audioInputStream.getFrameLength() * 1000)/format.getFrameRate()); 
       duration = milliseconds/1000.0; 



       try { 
        audioInputStream.reset(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
        return; 
       } 


      } 

    public AudioInputStream getInputStream() { 
      return audioInputStream; 
     } 

    public AudioFormat getFormat() { 

      AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED; 
      float rate = 44100.0F; 
      int sampleSize = 16; 
      boolean bigEndian = true; 
      int channels = 2; 

      return new AudioFormat(encoding, rate, sampleSize, 
        channels, (sampleSize/8) * channels, rate, bigEndian); 

     } 
    } 

答えて

2

あなたはそれが書かれていて、あなたを停止するためにバックグラウンドで実行中のスレッド、およびコードを言っているが、いくつかは、終了時にやるべき仕事をクリーンアップ持っています。したがって、いくつかの機能を使用するには、スレッドが終了するのを待たなければなりません。

public void stop() { 
    Thread t = thread; 
    thread = null;// this will cause your thread to exit 
    t.join();//this will wait for the thread to exit before returning. 
} 
:あなたは何ができるか

は次のように停止機能を変更で

関連する問題