Звук Java воспроизводится только один раз? - PullRequest
1 голос
/ 22 октября 2010

Я использую следующий метод для воспроизведения записанного звука, он работает нормально, но почему он воспроизводится только один раз, второй раз, когда я нажимаю кнопку воспроизведения, он ничего не делает, как восстановить данные?

  // 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 голосов
/ 22 октября 2010

Я понял, добавьте следующую строку после "shutDown (null)"

 if (file==null)
   try { audioInputStream.reset(); }
   catch (Exception e) { e.printStackTrace(); }

Теперь все работает отлично.

0 голосов
/ 22 октября 2010

Никогда не работал с аудио Java, но так как вы используете поток, вам нужно либо сбросить поток, если эта опция доступна, либо создавать новый поток каждый раз, когда вы читаете его.

...