Oi galera.
O meu problema é o seguinte, tenho de fazer uma aplicação que faça multiplicas capturas de som, com 10segundos entre cada captura.
Para isso estou a usar o timer do java que funciona perfeitamente, mas o meu problema é na caputra porque apenas efectua a captura com sucesso na primeira vez,
de seguida o ficheiro ‘.wav’ é criado mas sem captura nenhuma e apenas com 1kb de tamanho.
A minha ideia é diminuir o tempo entre o pedido para efectuar a captura “this.somG1.Gravacao(this.somG1);” e quando a captura realmente começa ou seja quando se invoca “this.recorder.start();”.
Alguem sabe o que estou a fazer mal?
Obrigado
Codigo que tem o timer e invoca a captura
private String retorno;
private GravarSom grava = new GravarSom();
private File outputFile = new File("c:\\ola.wav");
private AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100.0F, 16, 1, 2, 44100.0F, false);
private AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
private DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
private TargetDataLine targetDataLine = null;
public void run()
{
try
{
Thread t = new Thread();
t.setPriority(MAX_PRIORITY);
this.targetDataLine = (TargetDataLine) AudioSystem.getLine(this.info);
this.targetDataLine.open(this.audioFormat);
this.timer = new Timer(true);
this.timer.scheduleAtFixedRate(new RemindTask(this.targetType, this.outputFile, this.targetDataLine), this.tempoGravar, this.tempoRepetir);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
class RemindTask extends TimerTask
{
private AudioFileFormat.Type targetType;
private File outputFile;
private TargetDataLine targetDataLine;
private GravarSom somG1;
private long e;
RemindTask(AudioFileFormat.Type targetType2, File outputFile2, TargetDataLine targetDataLine2)
{
this.targetType = targetType2;
this.outputFile = outputFile2;
this.targetDataLine = targetDataLine2;
}
public void run()
{ //(AudioFileFormat.Type targetType, File outputFile,TargetDataLine targetDataLine)
try
{
this.somG1 = new GravarSom(this.targetDataLine, this.targetType, this.outputFile);
Thread t = new Thread();
t.setPriority(MAX_PRIORITY);
e = System.currentTimeMillis();
//utilizo este tempo para ver o tempo quando peço para iniciar a captura
this.somG1.Gravacao(this.somG1);
System.out.println(e);
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
Classe onde o codigo da captura esta definido
package som;
import java.io.IOException;
import java.io.File;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFileFormat;
public class GravarSom extends Thread
{
private TargetDataLine m_line;
private AudioFileFormat.Type m_targetType;
private AudioInputStream m_audioInputStream;
private GravarSom recorder;
private File m_outputFile;
private int segundosgravacao = 2;
private long e;
public GravarSom()
{}
public GravarSom(TargetDataLine line,AudioFileFormat.Type targetType,File file)
{
m_line = line;
m_audioInputStream = new AudioInputStream(line);
m_targetType = targetType;
m_outputFile = file;
}
@Override
public void start()
{
m_line.start();
super.start();
}
public void stopRecording()
{
m_line.stop();
//m_line.close(); this way the line will stay alive?
}
@Override
public void run()
{
try
{
Thread t = new Thread();
t.setPriority(MAX_PRIORITY);
AudioSystem.write(m_audioInputStream,m_targetType,m_outputFile);
}
catch (IOException e)
{
e.getMessage();
}
}
public void Gravacao(GravarSom recorder2)
{
try
{
this.recorder = recorder2;
//tempo onde a captura realmente inicia.
e = System.currentTimeMillis();
this.recorder.start();
this.recorder.sleep(2000);
this.recorder.stopRecording();
System.out.println("\t" + e);
}
catch (Exception ex)
{
ex.getMessage();
}
}
}