Я хочу задать повторяющийся вопрос о том, как записать звук, отправляемый на динамики. Но я хочу кое-что узнать о ранее отвеченном.
Я пошел на эту страницу: Захват вывода динамика в Java
Я видел этот код, отправленный разработчиком:
import javax.sound.sampled.*;
import java.io.*;
public class JavaSoundRecorder {
// record duration, in milliseconds
static final long RECORD_TIME = 10000; // 1 minute
// path of the wav file
File wavFile = new File("E:/RecordAudio.wav");
// format of audio file
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
// the line from which audio data is captured
TargetDataLine line;
/**
* Defines an audio format
*/
AudioFormat getAudioFormat() {
float sampleRate = 16000;
int sampleSizeInBits = 8;
int channels = 1;
boolean signed = true;
boolean bigEndian = true;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed, bigEndian);
return format;
}
/**
* Captures the sound and record into a WAV file
*/
void start() {
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 ex) {
ex.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
/**
* Closes the target data line to finish capturing and recording
*/
void finish() {
line.stop();
line.close();
System.out.println("Finished");
}
/**
* Entry to run the program
*/
public static void main(String[] args) {
final JavaSoundRecorder recorder = new JavaSoundRecorder();
// creates a new thread that waits for a specified
// of time before stopping
Thread stopper = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(RECORD_TIME);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
recorder.finish();
}
});
stopper.start();
// start recording
recorder.start();
}
}
Теперь у меня есть несколько вопросов, которые я хочу задать.
Этот код работает нормально на моей windows ОС, но не работает на моей Ubuntu на одной машине (двойная загрузка). В Ubuntu он записывает тишину, и я пытался включить все микшеры, но не могу заставить его работать
Я хочу, чтобы вывод поступал на динамики, и я получал вывод на динамики , Звук окрестностей с очень небольшим звуком того, что я на самом деле хочу.
Пожалуйста, ответьте на мои вопросы из 2 вопросов выше.
Что я хочу? Я хочу чистый звук, который в данный момент воспроизводится и передается на динамики моего ноутбука. Я не хочу аудио, которое уже испускается, а затем перезаписывается, потому что это плохо. Также мне нужна причина, по которой мой Ubuntu не поддерживает этот код (это неопределенная информация, но я использую BlueJ в windows для запуска этого и NetBeans в Ubuntu (без sudo)).
Я видел несколько видео на YouTube, чтобы понять теорию:
- https://www.youtube.com/watch?v=GVtl19L9GxU
- https://www.youtube.com/watch?v=PTs01qr9RlY
Я прочитал документацию на полторы страницы oracle здесь: https://docs.oracle.com/javase/tutorial/sound/accessing.html
В документации упоминалось следующее:
An applet running with the applet security manager can play, but not record, audio.
An application running with no security manager can both play and record audio.
An application running with the default security manager can play, but not record, audio.
Но я не думаю, что стал менеджером по безопасности.
В конце я не добился успеха в том, что хочу сделать. Вместо того, чтобы идти дальше в документации, я подумал задать вопрос здесь.