Olá, recentemente eu estava programando um gravador de tela, o poblema é que ele faz oque o nome diz “grava a tela” não o audio!, então eu pensei em adicionar um codigo para ele gravar o audio do microfone e depois ão finalizar a gravação ele gravar o video e o audio separados, o poblema é que eu não encontrei nenhum que funcionou direito!, eu fiquei 1 dia enteiro na internet procurando, em todos que procurei a maioria tinha erros, o AudioSystem.write() trava a thread, e para a gravação e também desabilita qualquer tentativa de parar a Gravação, alguem pode me ajudar?
o Codigo fonte:
como é um pouco grande… deixei o download no mediafire.
https://www.mediafire.com/file/gjnyp7m2ayuoc1t/Interface.java/file
Bem, infelizmente eu não tive resposta porém sem poblema!, provavelmente se você está lendo em um futuro proximo, aqui está o codigo que eu usei para poder gravar o audio e salvar em um .wav, espero que ajude, ah é ele não para a thread. ele separa ela aqui está o codigo:
Classe que Grava o Audio:
[code]
package com.fakenuger.thefakerecorder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
public class Recorder {
private static final int BUFFER_SIZE = 4096;
private ByteArrayOutputStream recordBytes;
private TargetDataLine audioLine;
private AudioFormat format;
private boolean isRunning;
/**
* Defines a default audio format used to record
*/
AudioFormat getAudioFormat() {
float sampleRate = 16000;
int sampleSizeInBits = 8;
int channels = 2;
boolean signed = true;
boolean bigEndian = true;
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
}
public void start() throws LineUnavailableException {
format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if (!AudioSystem.isLineSupported(info)) {
throw new LineUnavailableException("The system does not support the specified format.");
}
audioLine = AudioSystem.getTargetDataLine(format);
audioLine.open(format);
audioLine.start();
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = 0;
recordBytes = new ByteArrayOutputStream();
isRunning = true;
while (isRunning) {
bytesRead = audioLine.read(buffer, 0, buffer.length);
recordBytes.write(buffer, 0, bytesRead);
}
}
public void stop() throws IOException {
isRunning = false;
if (audioLine != null) {
audioLine.drain();
audioLine.close();
}
}
public void save(File wavFile) throws IOException {
byte[] audioData = recordBytes.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(audioData);
AudioInputStream audioInputStream = new AudioInputStream(bais, format,
audioData.length / format.getFrameSize());
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, wavFile);
audioInputStream.close();
recordBytes.close();
}
}
[code]
Classe responsavel por “Executar” o Gravador:
[code]
package com.fakenuger.thefakerecorder;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.LineUnavailableException;
public class RecorderController {
private File wavFile = new File("/home/angela/Records/testeRC.wav");
private Recorder recorder;
public void startAudioRecord(String path,String name) {
wavFile = new File(path + name + ".wav");
recorder = new Recorder();
// create a separate thread for recording
Thread recordThread = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("Start recording...");
recorder.start();
} catch (LineUnavailableException ex) {
ex.printStackTrace();
System.exit(-1);
}
}
});
recordThread.start();
}
public void stopAudioRecord() {
try {
recorder.stop();
recorder.save(wavFile);
System.out.println("STOPPED");
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println("DONE");
}
}
[code]