gpt4 book ai didi

Java声音只能播放一次?

转载 作者:行者123 更新时间:2023-12-01 05:53:02 25 4
gpt4 key购买 nike

我使用下面的方法来播放录制的声音,效果很好,但是为什么只播放一次,第二次点击播放按钮时,什么也没做,如何重置数据?

  // 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;

第一次播放有数据,正常,第二次就坏了。为什么 ?如何解决?

最佳答案

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

关于Java声音只能播放一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com