我在这里再次请求你的帮助。
我正在尝试使用来自互联网的代码从麦克风录制语音。
这是音频格式的配置:
public class microfono {
File wavFile = new File("C:\\NXB\\Kamui\\img\\audio.wav");
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
TargetDataLine line;
AudioFormat getAudioFormat() {
float sampleRate = 16000;
int sampleSizeInBits = 8;
int channels = 2;
boolean signed = true;
boolean bigEndian = true;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed, bigEndian);
return format;
}
public void StartRecording(ActionEvent event) throws IOException {
try {
AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
// checks if system supports the data line
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Error");
System.exit(0);
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
System.out.println("Startig...");
AudioInputStream ais = new AudioInputStream(line);
System.out.println("Start recording...");
// start recording
AudioSystem.write(ais, fileType, wavFile);
} catch (LineUnavailableException ex) {
ex.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
此刻的代码无限期地开始录制,如果我停止程序,则记录在路径中保存为.wav文件,但我需要在保存wav文件的任何时候停止录制。
我试过这种方式,但程序停止了
void finish() {
line.stop();
line.close();
System.out.println("Finished");
}
答案 0 :(得分:3)
我做了JavaSoundRecorder
延长Task
。现在它应该记录在背景中。
JavaSoundRecorder类:
import java.io.*;
import javafx.concurrent.Task;
import javax.sound.sampled.*;
/**
* A sample program is to demonstrate how to record sound in Java author:
* www.codejava.net
* http://www.codejava.net/coding/capture-and-record-sound-into-wav-file-with-java-sound-api
*/
public class JavaSoundRecorder extends Task<Void>
{
// record duration, in milliseconds
static final long RECORD_TIME = 60000; // 1 minute
// path of the wav file
File wavFile = new File("RecordAudio.wav");
// format of audio file
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
// the line from which audio data is captured
TargetDataLine line;
@Override
protected Void call() throws Exception
{
try {
AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
// checks if system supports the data line
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Line not supported");
System.exit(0);
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
System.out.println("Start capturing...");
AudioInputStream ais = new AudioInputStream(line);
System.out.println("Start recording...");
// start recording
AudioSystem.write(ais, fileType, wavFile);
}
catch (LineUnavailableException | IOException ex) {
ex.printStackTrace();
}
return null;
}
/**
* Defines an audio format
*/
AudioFormat getAudioFormat()
{
float sampleRate = 16000;
int sampleSizeInBits = 8;
int channels = 2;
boolean signed = true;
boolean bigEndian = true;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed, bigEndian);
return format;
}
/**
* Closes the target data line to finish capturing and recording
*/
void finish()
{
line.stop();
line.close();
System.out.println("Finished");
}
}
主类:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication58 extends Application
{
JavaSoundRecorder javaSoundRecorder;
@Override
public void start(Stage primaryStage)
{
Button btn = new Button();
btn.setText("Start");
btn.setOnAction((ActionEvent event) -> {
if (btn.getText().equals("Start")) {
javaSoundRecorder = new JavaSoundRecorder();
Thread thread = new Thread(javaSoundRecorder);
thread.start();
btn.setText("Stop");
}
else {
javaSoundRecorder.finish();
javaSoundRecorder.cancel();
btn.setText("Start");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}