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