[RESOLVIDO]Fazer a GUI em um programa de captura de audio

9 respostas
B

Oi, copiei o exemplo de como fazer um programa para capturar audio do microfone através de JMF que achei no JMF Guide que baixei no site da Oracle e meio que entendi como ele funciona, mas quando fui tentar criar a interface gráfica pra ele não deu certo e não sei o que to fazendo errado.

Alguém pode me apontar um caminho?

package exemploaudio;

import java.awt.Component;
import javax.media.Processor;
import javax.swing.JFrame;


public class NewClass extends JFrame{

    public NewClass(Processor p){
        Component visualComponent = p.getVisualComponent();
        add(visualComponent);

        Component controlPanel = p.getControlPanelComponent();
        add(controlPanel);
    }

}

Classe main:

package exemploaudio;

import java.awt.Component;
import javax.swing.JApplet;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.media.*;
import javax.media.control.StreamWriterControl;
import javax.media.format.AudioFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;
import jmapps.util.StateHelper;

public class Main {

    public static void main(String[] args) {
        CaptureDeviceInfo di = null;
        Processor p = null;
        StateHelper sh = null;
        DataSink filewriter = null;

        Vector deviceList = CaptureDeviceManager.getDeviceList(new AudioFormat("Linear", 44100, 16, 2));
        if (deviceList.size() > 0) {
            di = (CaptureDeviceInfo) deviceList.firstElement();
        } else {
            System.exit(-1);
        }

        try {
            p = Manager.createProcessor(di.getLocator());
            sh = new StateHelper(p);
        } catch (IOException e) {
            System.err.println("IOException");
        } catch (NoPlayerException e) {
            System.err.println("NoPlayerException");
        }

        if (!sh.configure(10000)) {
            System.exit(-1);
        }

        p.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.WAVE));

        if (!sh.realize(10000)) {
            System.exit(-1);
        }

        DataSource source = p.getDataOutput();
        try {
            MediaLocator dest = new MediaLocator(new URL("file://foo.wav"));
            filewriter = Manager.createDataSink(source, dest);
            filewriter.open();
        } catch (NoDataSinkException e) {
            System.exit(-1);
        } catch (IOException e) {
            System.exit(-2);
        } catch (SecurityException e) {
            System.exit(-3);
        }

        StreamWriterControl swc = (StreamWriterControl) p.getControl("javax.media.control.StreamWriterControl");

        if (swc != null) {
            swc.setStreamSizeLimit(5000000);
        }

        try {
            filewriter.start();
        } catch (IOException e) {
            System.exit(-1);
        }

        sh.playToEndOfMedia(5000);
        sh.close();
        filewriter.close();

//Essa foi a parte que adicionei por minha conta, sem isso aqui ele funciona, mas sem GUI.

        NewClass frame = new NewClass(p);
        frame.setSize(375, 100);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);

    }
}

9 Respostas

marcelo.bellissimo

Mas o que acontece, um erro? Ou simplesmente não aparece a janela?

B

Ah desculpa, esqueci do erro:

Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addImpl(Container.java:1041) at java.awt.Container.add(Container.java:959) at javax.swing.JFrame.addImpl(JFrame.java:540) at java.awt.Container.add(Container.java:365) at exemploaudio.NewClass.<init>(NewClass.java:13) at exemploaudio.Main.main(Main.java:80) Java Result: 1

E também não aparece a janela, nem nada.

marcelo.bellissimo

O que tem na linha 13 do seu NewClass.java ?

B

Tem o

add(visualComponent);
marcelo.bellissimo

Bem, eu não entendo de JMF, mas algo está fazendo com que o seu visualComponent seja null
Veja esse exemplo de JMF, talvez ele funcione corretamente no seu caso:
http://snippets.dzone.com/posts/show/2912

B

Bem, eu não entendo de JMF, mas algo está fazendo com que o seu visualComponent seja null…

Não tinha me tocado do null, pelo menos agora sei por onde começar a procurar.

Valeu :smiley:

marcelo.bellissimo

beginner1990:
Bem, eu não entendo de JMF, mas algo está fazendo com que o seu visualComponent seja null…

Não tinha me tocado do null, pelo menos agora sei por onde começar a procurar.

Valeu :smiley:

Opa, magina… sempre preste bastante atenção no stackTrace que é gerado quando ocorre uma exceção… salvo casos raros de alguns frameworks porcos, a exception jogada no console é bem detalhada e dá pra descobrir facilmente do que se trata… veja:

Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addImpl(Container.java:1041) at java.awt.Container.add(Container.java:959) at javax.swing.JFrame.addImpl(JFrame.java:540) at java.awt.Container.add(Container.java:365) at exemploaudio.NewClass.<init>(NewClass.java:13) at exemploaudio.Main.main(Main.java:80) Java Result: 1

Logo na primeira linha já mostra, Exception in thread “main” java.lang.NullPointerException .
Depois é só ir “rastreando” linha por linha… as 4 primeiras linhas são das classes da JVM mesmo, daí pra frente é coisa sua, do seu código, daí cheguei a linha 13 do seu arquivo NewClass.java:

at java.awt.Container.addImpl(Container.java:1041)
    at java.awt.Container.add(Container.java:959)
    at javax.swing.JFrame.addImpl(JFrame.java:540)
    at java.awt.Container.add(Container.java:365)

at exemploaudio.NewClass.(NewClass.java:13)
at exemploaudio.Main.main(Main.java:80)

Simples… ah, se descobrir posta a resposta aí pra gente!

B

Entendi, entendi.

Pó deixar que posto sim.

Valeu, de novo.

B

Descobri o problema:

Eu estava tentando criar uma interface gráfica com elementos de vídeo num programa feito para apenas capturar áudio. Quando eu fazia:
public NewClass(Processor p){  
        Component visualComponent = p.getVisualComponent();  
        add(visualComponent);

o p.getVisualComponent() retornava null.

Mudei o código para:
package exemploaudio;

import java.awt.Component;
import javax.media.Processor;
import javax.swing.JFrame;

public class NewClass extends JFrame {

    Component controlPanel, visualComponent;

    public NewClass(Processor p) {

        if ((controlPanel = p.getControlPanelComponent()) != null) {
            add(controlPanel);
        } else {
            System.out.println("NULL!");
        }
    }
}

e compilou. Não ficou utilizável a interface, mas compilou, hehe.

Valeu :D

Criado 24 de agosto de 2010
Ultima resposta 26 de ago. de 2010
Respostas 9
Participantes 2