gpt4 book ai didi

java 录音

转载 作者:行者123 更新时间:2023-11-30 04:54:05 37 4
gpt4 key购买 nike

我有一个软件,可以记录 5 秒间隔的声音,然后将其发送进行处理。它在无限循环中运行,如下所示:

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);
}

在上面的代码中,我必须在录制完成后添加一行 Thread.sleep(300); ,否则 recorder.getInputStream() 返回 null。为什么会发生这种情况?有没有办法改变它,这样就不需要延迟?

记录器代码:

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

}
}

最佳答案

您告诉在后台运行的线程停止,并且代码(正如其所写)在退出时需要执行一些清理工作。因此,您必须等待线程完成才能使用某些功能。

你可以做的是将停止函数更改为:

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.
}

关于java 录音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114960/

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