Duvida captura som

0 respostas
A

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();
                }
    }
}
Criado 11 de janeiro de 2011
Respostas 0
Participantes 1