Java声音只播放一次?

时间:2010-10-21 20:23:46

标签: java audio playback

我使用以下方法播放录制的声音,它工作正常,但为什么它只播放一次,第二次点击播放按钮,它什么都不做,如何重置数据?

  // Write data to the OutputChannel.
  public class Playback implements Runnable
  {
    SourceDataLine line;
    Thread thread;

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

    public void stop() { thread=null; }

    private void shutDown(String message)
    {
      if ((errStr=message)!=null)
      {
        System.err.println(errStr);
        samplingGraph.repaint();
      }
      if (thread!=null)
      {
        thread=null;
        samplingGraph.stop();
        if (Java_Sound.Running_In_All_Permissions_Mode) captB.setEnabled(true);
        pausB.setEnabled(false);
        playB.setText("Play");
      }
    }

    public void run()
    {
      AudioFormat format=formatControls.getFormat();                                               // get an AudioInputStream of the desired format for playback
      AudioInputStream playbackInputStream=AudioSystem.getAudioInputStream(format,audioInputStream);

      if (playbackInputStream==null)
      {
        shutDown("Unable to convert stream of format "+audioInputStream+" to format "+format);
        return;
      }
      SourceDataLine.Info info=new DataLine.Info(SourceDataLine.class,format);                     // define the required attributes for our line,and make sure a compatible line is supported.

      if (AudioSystem.isLineSupported(info))
      {
         try                                                                                        // get and open the source data line for playback.
        {
          line=(SourceDataLine)AudioSystem.getLine(info);
          line.open(format,bufSize);
        }
        catch (LineUnavailableException ex)
        {
          shutDown("Unable to open the line: "+ex);
          return;
        }
        int frameSizeInBytes=format.getFrameSize();                                                // play back the captured audio data
        int bufferLengthInFrames=line.getBufferSize()/8;
        int bufferLengthInBytes=bufferLengthInFrames*frameSizeInBytes;
        byte[] data=new byte[bufferLengthInBytes];
        int numBytesRead=0;
        line.start();                                                                              // start the source data line
        while (thread!=null)
        {
          try
          {
            if ((numBytesRead=playbackInputStream.read(data))==-1) break;
            int numBytesRemaining=numBytesRead;
             while (numBytesRemaining>0) { numBytesRemaining-=line.write(data,0,numBytesRemaining); }
          }
          catch (Exception e)
          {
            shutDown("Error during playback: "+e);
            break;
          }
        }
      }
       if (thread!=null) line.drain();                                                              // we reached the end of the stream. Let the data play out,then stop and close the line.
      line.stop();
      line.close();
      line=null;
      shutDown(null);
    }
  }

经过我的测试,我发现这一行导致了问题

if ((numBytesRead=playbackInputStream.read(data))==-1) break;

我第一次回放,有数据,它工作正常,但第二次,它打破了。为什么?如何解决?

2 个答案:

答案 0 :(得分:0)

从未使用过java音频,但由于您正在使用流,因此如果该选项可用,则需要重置流,或者每次读取时都需要创建新流。

答案 1 :(得分:0)

我想通了,在“shutDown(null)”

之后添加以下行
 if (file==null)
   try { audioInputStream.reset(); }
   catch (Exception e) { e.printStackTrace(); }

现在它完美无缺。