Socket servidor/cliente erro Java heap space

13 respostas
J

Programa Servidor

Inicializa webcam captura uma imagem e envia via socket para porta 8189, e repere isso atraves de um time, ou seja fica sempre enviando uma imagem, quando o cliente pega a imagem ele busca outra e envia.

[color=red]O programa cliente é simples, em j2me apenas acessa via socketconnection usando um inputstream,
o programa funciona cerca de 40 segundos, capturando e enviando imagem, so que apos 40 segundo da um erro.
ja tentei aumentar a memoria da vm mais nao adianta so retarda o erro.
Alguem tem alguma ideia de como resolver isso???[/color]

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

/*

  • JFrame.java
  • Created on 14/07/2010, 20:38:22
    */
package javaapplication16;

import javax.media.CannotRealizeException;

import javax.media.NoPlayerException;

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.imageio.ImageIO;

import javax.media.Buffer;

import javax.media.CaptureDeviceInfo;

import javax.media.CaptureDeviceManager;

import javax.media.Manager;

import javax.media.MediaLocator;

import javax.media.Player;

import javax.media.control.FrameGrabbingControl;

import javax.media.format.VideoFormat;

import javax.media.util.BufferToImage;

import javax.swing.JOptionPane;
public class JFrame extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

public static Player player = null;

public CaptureDeviceInfo di = null;  //  @jve:decl-index=0:

public MediaLocator ml = null;

//private Buffer buf = null;

//public Image img = null;

//public Image img1 = null;

//public Image img2 = null;

public VideoFormat vf = null;

//public BufferToImage btoi = null;

//       public int sourceWidth ;

// public int sourceHeight ;

//public int thumbWidth = 64;

//public int thumbHeight = -1;

//private int ativa=0;
/** Creates new form JFrame */
public JFrame() {
    initComponents();
    inicializa();
    this.setSize(600,500);
    setLocation(170, 05);
}

private void inicializa(){

String str2 = vfw//0”;

di=null;

ml=null;

di = CaptureDeviceManager.getDevice(str2);

ml =  new MediaLocator(vfw://0”);

try {

player = Manager.createRealizedPlayer(ml);

} catch (IOException ex) {

System.out.println(Entrou 1);

Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);

} catch (NoPlayerException ex) {

Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);

System.out.println(Entrou 2);
} catch (CannotRealizeException ex) {
        Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println("Entrou 3");

    }
        player.start();
        Component comp;
        if ((comp = player.getVisualComponent()) != null) {
            add(comp, BorderLayout.NORTH);
        }
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("Conectar");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("jButton2");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    jMenu1.setText("Sobre");
    jMenu1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jMenu1MouseClicked(evt);
        }
    });
    jMenu1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jMenu1ActionPerformed(evt);
        }
    });
    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jButton2))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(227, Short.MAX_VALUE)
            .addComponent(jButton2)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton1))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

captura();
}

public void captura(){

//

Buffer buf = null;

BufferToImage btoi = null;

Image img = null;
FrameGrabbingControl fgc = (FrameGrabbingControl) player

.getControl(javax.media.control.FrameGrabbingControl);

buf=null;

img=null;

buf = fgc.grabFrame();

try {

btoi = new BufferToImage((VideoFormat) buf.getFormat());

img = createImage(300, 200);

img = btoi.createImage(buf) ; ////aqui

//               fgc=null;
gravaImg(img);///aqui
                    //parece que trava aqui  jgi0949gjidjjjgenbnnon
                    //dfffefesfe
                    //fesfsxxxxxxxxxxxxxxxx
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "não foi possivel encontrar " + "o dispositivo para a captura da imagem.");

                                       }

}
private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

JOptionPane.showMessageDialog(null, Programador Jean Ricier - Acesso remoto a webcam J2se e j2me);

}

private void jMenu1MouseClicked(java.awt.event.MouseEvent evt) {

// TODO add your handling code here:

JOptionPane.showMessageDialog(null, Programador Jean Ricier - Acesso remoto a webcam J2se e j2me);

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

player.close();

new JFrame();

}

public void gravaImg (Image imagem) throws IOException{
 Image img1=null;
 BufferedImage img=null;

try {

//   ImageIO.write((RenderedImage) imagem, "jpg", new File(caminho));
          ServerSocket s=new ServerSocket(8189);
          Socket incoming=s.accept();
          OutputStream os=incoming.getOutputStream();
          img=(BufferedImage) imagem;
          BufferedImage new_img = new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);

          Graphics2D g = new_img.createGraphics();
          g.drawImage(imagem, 0, 0, 300, 200, null);

   ImageIO.write(new_img, "png", os);

//sem isso nao roda cai no exeption
os.close(); //xx
s.close(); //xx
///xxxxxxxxxxxxxxxxxxxx
}

catch (IOException e) {

JOptionPane.showMessageDialog(null, "não foi possivel encontrar " + o dispositivo para a captura da imagem.);

e.printStackTrace();

}

captura();//////e aqui e aqui o problemafjfjdskkfsjfskk
////f/df/sf/sf/ss/f/f/f/f/f/f/f/

}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
// End of variables declaration

}

Exception in thread AWT-EventQueue-0 java.lang.OutOfMemoryError: Java heap space

at java.awt.image.DataBufferInt.(DataBufferInt.java:41)

at java.awt.image.Raster.createPackedRaster(Raster.java:458)

at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)

at java.awt.image.AffineTransformOp.createCompatibleDestImage(AffineTransformOp.java:454)

at com.sun.media.util.BufferToBufferedImage.createImage(BufferToBufferedImage.java:69)

at javax.media.util.BufferToImage.createImage(BufferToImage.java:171)

at javaapplication16.JFrame.captura(JFrame.java:172)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

at javaapplication16.JFrame.captura(JFrame.java:175)

at javaapplication16.JFrame.gravaImg(JFrame.java:235)

CONSTRUÍDO COM SUCESSO (tempo total: 4 minutos 41 segundos)

13 Respostas

ViniGodoy

Use um profiler para identificar que objeto está segurando tanta memória. E daí tente imaginar como fazer para desalocar esses dados.
Eu recomendo o VisualVM:
https://visualvm.dev.java.net/

O StackTrace dificilmente ajuda em problemas de memory leak, pois pode ser que seu gargalo esteja em outro lugar. Embora no seu caso, pela curta execução do seu programa, há altas chances dele estar indicando o local aproximado do problema.

J

Bom dia Vinigodoy

[color=red]Executei o profiler vm no netbeans da minha aplicaçao, nunca tinha usado visual vm, nao sei se fiz corretamente[/color]

Informações básicas:
Tirada em: Thu Jul 22 11:13:42 BRT 2010
Arquivo: D:\Documents and Settings\Administrador\Meus documentos\NetBeansProjects\JavaApplication16\nbproject\private\profiler\java_pid2636.hprof
Tamanho do arquivo: 65,3 MB

Total de bytes: 66.443.445
Total de classes: 2.184
Total de instâncias: 42.265
Classloaders: 10
Raízes GC: 1.909
Número de objetos pendentes de finalização: 0

Ambiente:
SO: Windows XP (5.1) Service Pack 3
Arquitetura: x86 32bit
Início do Java: D:\Arquivos de programas\Java\jdk1.6.0_17\jre
JVM: Java HotSpot™ Client VM (14.3-b01, mixed mode)

Propriedades do sistema:
Exibir propriedades do sistema

Threads no princípio do despejo:

“DestroyJavaVM” prio=5 tid=20 RUNNABLE

AWT-EventQueue-0 prio=6 tid=19 RUNNABLE

at com.sun.media.renderer.video.BasicVideoRenderer.grabFrame(BasicVideoRenderer.java:293)

at javaapplication16.JFrame.captura(JFrame.java:168)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.gravaImg(JFrame.java:239)

at javaapplication16.JFrame.captura(JFrame.java:180)

at javaapplication16.JFrame.jButton1ActionPerformed(JFrame.java:153)

at javaapplication16.JFrame.access$000(JFrame.java:38)

at javaapplication16.JFrame$1.actionPerformed(JFrame.java:105)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1981)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6263)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)

at java.awt.Component.processEvent(Component.java:6028)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4637)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4578)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2475)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:175)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:136)
Finalizer daemon prio=8 tid=3 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:119)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
JMF thread: SendEventQueue: com.sun.media.content.unknown.Handler prio=9 tid=23 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at com.sun.media.util.ThreadedEventQueue.dispatchEvents(ThreadedEventQueue.java:50)

at com.sun.media.util.ThreadedEventQueue.run(ThreadedEventQueue.java:92)

“Signal Dispatcher” daemon prio=9 tid=4 RUNNABLE

Reference Handler daemon prio=10 tid=2 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
Loop thread: com.sun.media.renderer.video.DDRenderer@35e6e3 prio=3 tid=30 BLOCKED

at com.sun.media.renderer.video.BasicVideoRenderer.process(BasicVideoRenderer.java:117)

at com.sun.media.BasicRendererModule.processBuffer(BasicRendererModule.java:727)

at com.sun.media.BasicRendererModule.scheduleBuffer(BasicRendererModule.java:499)

at com.sun.media.BasicRendererModule.doProcess(BasicRendererModule.java:405)

at com.sun.media.RenderThread.process(BasicRendererModule.java:1114)

at com.sun.media.util.LoopThread.run(LoopThread.java:135)
D3D Screen Updater daemon prio=7 tid=38 TIMED_WAITING

at java.lang.Object.wait(Native Method)

at sun.java2d.d3d.D3DScreenUpdateManager.run(D3DScreenUpdateManager.java:421)

at java.lang.Thread.run(Thread.java:619)

“Attach Listener” daemon prio=5 tid=5 RUNNABLE

*** Profiler Agent Special Execution Thread 6 daemon prio=5 tid=9 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at org.netbeans.lib.profiler.server.ProfilerServer$SeparateCmdExecutionThread.run(ProfilerServer.java:286)
VFW Request Thread prio=6 tid=22 TIMED_WAITING

at java.lang.Thread.sleep(Native Method)

at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:783)

at java.lang.Thread.run(Thread.java:619)
*** JFluid Monitor thread *** daemon prio=10 tid=8 TIMED_WAITING

at java.lang.Thread.sleep(Native Method)

at org.netbeans.lib.profiler.server.Monitors$SurvGenAndThreadsMonitor.run(Monitors.java:183)
Loop thread: com.sun.media.parser.RawBufferParser$FrameTrack@1cc0a7f prio=3 tid=37 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at com.sun.media.parser.RawBufferParser$FrameTrack.readFrame(RawBufferParser.java:672)

at com.sun.media.SourceThread.process(BasicSourceModule.java:664)

at com.sun.media.util.LoopThread.run(LoopThread.java:135)
JMF thread: SendEventQueue: com.sun.media.PlaybackEngine prio=9 tid=24 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at com.sun.media.util.ThreadedEventQueue.dispatchEvents(ThreadedEventQueue.java:50)

at com.sun.media.util.ThreadedEventQueue.run(ThreadedEventQueue.java:92)
*** Profiler Agent Communication Thread daemon prio=10 tid=7 RUNNABLE

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:131)

at java.net.SocketInputStream.read(SocketInputStream.java:184)

at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2249)

at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2429)

at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2501)

at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2571)

at java.io.ObjectInputStream.read(ObjectInputStream.java:820)

at org.netbeans.lib.profiler.wireprotocol.WireIO.receiveCommandOrResponse(WireIO.java:85)

at org.netbeans.lib.profiler.server.ProfilerServer.listenToClient(ProfilerServer.java:1704)

at org.netbeans.lib.profiler.server.ProfilerServer.run(ProfilerServer.java:682)
VFW TransferDataThread prio=9 tid=28 TIMED_WAITING

at java.lang.Object.wait(Native Method)

at com.sun.media.protocol.vfw.VFWSourceStream$TransferDataThread.run(VFWSourceStream.java:1127)
Loop thread prio=9 tid=31 TIMED_WAITING

at java.lang.Thread.sleep(Native Method)

at com.sun.media.StatsThread.process(BasicPlayer.java:1828)

at com.sun.media.util.LoopThread.run(LoopThread.java:135)
AWT-Windows daemon prio=6 tid=16 RUNNABLE

at sun.awt.windows.WToolkit.eventLoop(Native Method)

at sun.awt.windows.WToolkit.run(WToolkit.java:293)

at java.lang.Thread.run(Thread.java:619)
AWT-Shutdown prio=5 tid=17 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)

at java.lang.Thread.run(Thread.java:619)
VFW VideoPollThread prio=9 tid=27 TIMED_WAITING

at java.lang.Thread.sleep(Native Method)

at com.sun.media.protocol.vfw.VFWSourceStream$PushThread.run(VFWSourceStream.java:1060)
Java2D Disposer daemon prio=10 tid=15 WAITING

at java.lang.Object.wait(Native Method)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:119)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

at sun.java2d.Disposer.run(Disposer.java:125)

at java.lang.Thread.run(Thread.java:619)
ViniGodoy

Ok, esses textos não ajudam em nada. O profiler gera diversos gráficos, indicando quais classes ocupam muita memória na sua aplicação. É elas que você tem que identificar e então tentar imaginar o porque de não estarem sendo desalocadas.

J

SERIA ISSO???

ViniGodoy

Sim. Agora peça para ver os detalhes de onde esses int[] estão. Por amostragem, você pode ver quem é o objeto que os contém. Normalmente em caso de leaks é um objeto só.

Vá rastreando até saber exatamente quem é o causador do seu problema.

J

Exception in thread “AWT-EventQueue-0” java.lang.OutOfMemoryError: Java heap space
at com.sun.media.renderer.video.BasicVideoRenderer.grabFrame(BasicVideoRenderer.java:290)

O problema pode estar relacionado com BasicVideoRenderer.grabFrame é um arquivo .java do jmf usado para captura de imagens

Ja tentei de tudo

J

resolvido

ViniGodoy

E o problema qual era?

J
usando o visual vm verifiquei que o erro era por conta da recursao da funcao simplesmente substitui por um while(true){}

[color=red]se vc puder me tirar uma duvida agora, como faço para finalizar o while ao clicar em um botao ou ao clicar no botao padrao de fechar o jframe, eu tentei mais ele nao aceita nenhum comando fica no while o tempo inteiro(funciona blz so nao consigo finalizar).

while(true)[/color]{

captura foto

envia via socket

e retorna

}
ViniGodoy

Use uma variável de controle, ou faça:

while (!Thread.interrupted()) { ... }

E chame interrupt() sobre a thread.

J

[color=red]Ele nao aceita nem clicar no botao parece que fica travado por conta do serversocket e do while[/color]

[color=red]o servidor fica aguardando a conexao do cliente enquando isso nada pode ser feito, nao da neim pra clicar em botao nenhum[/color]

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

/*

  • JFrame.java
  • Created on 14/07/2010, 20:38:22
    */
package javaapplication16;

import javax.media.CannotRealizeException;

import javax.media.NoPlayerException;

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.imageio.ImageIO;

import javax.media.Buffer;

import javax.media.CaptureDeviceInfo;

import javax.media.CaptureDeviceManager;

import javax.media.Manager;

import javax.media.MediaLocator;

import javax.media.Player;

import javax.media.control.FrameGrabbingControl;

import javax.media.format.VideoFormat;

import javax.media.util.BufferToImage;

import javax.swing.JOptionPane;
public class JFrame extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

public static Player player = null;

public CaptureDeviceInfo di = null;  //  @jve:decl-index=0:

public MediaLocator ml = null;

//private Buffer buf = null;

//public Image img = null;

//public Image img1 = null;

//public Image img2 = null;

public VideoFormat vf = null;

public int sair=0;

//public BufferToImage btoi = null;

//       public int sourceWidth ;

// public int sourceHeight ;

//public int thumbWidth = 64;

//public int thumbHeight = -1;

//private int ativa=0;
/** Creates new form JFrame */
public JFrame() {
    initComponents();
    inicializa();
    this.setSize(600,500);
    setLocation(170, 05);
}

private void inicializa(){

String str2 = vfw//0”;

di=null;

ml=null;

di = CaptureDeviceManager.getDevice(str2);

ml =  new MediaLocator(vfw://0”);

try {

player = Manager.createRealizedPlayer(ml);

} catch (IOException ex) {

System.out.println(Entrou 1);

Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);

} catch (NoPlayerException ex) {

Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);

System.out.println(Entrou 2);
} catch (CannotRealizeException ex) {
        Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println("Entrou 3");

    }
        player.start();
        Component comp;
        if ((comp = player.getVisualComponent()) != null) {
            add(comp, BorderLayout.NORTH);
        }
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("Conectar");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("jButton2");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    jMenu1.setText("Sobre");
    jMenu1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jMenu1MouseClicked(evt);
        }
    });
    jMenu1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jMenu1ActionPerformed(evt);
        }
    });
    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jButton2))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(227, Short.MAX_VALUE)
            .addComponent(jButton2)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jButton1))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

captura();
}

public void captura(){

//while(sair==0){
while(!Thread.interrupted()) {

if(sair==1){break;}

//

jButton2.setVerifyInputWhenFocusTarget(true);

Buffer buf = null;

BufferToImage btoi = null;
Image img = null;
Image img1=null;
FrameGrabbingControl fgc=null;

//  fgc = (FrameGrabbingControl) player.getControl(“javax.media.control.FrameGrabbingControl”);

fgc = (FrameGrabbingControl) player.getControl(“javax.media.control.FrameGrabbingControl”);

<a href="//player.close">//player.close</a>();

buf = fgc.grabFrame();

try {
btoi = new BufferToImage((VideoFormat) buf.getFormat());
                img = createImage(300, 200);
                img = btoi.createImage(buf) ; ////aqui
                    //               fgc=null;
     ServerSocket s=new ServerSocket(8189);
         Socket incoming=s.accept();
      OutputStream os=incoming.getOutputStream();
          img1=(BufferedImage) img;

// BufferedImage new_img = new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);
BufferedImage new_img = new BufferedImage(300, 200, BufferedImage.TYPE_3BYTE_BGR);

Graphics2D g = new_img.createGraphics();
          g.drawImage(img, 0, 0, 300, 200, null);

   ImageIO.write(new_img, "png", os);

//sem isso nao roda cai no exeption
os.close(); //xx
s.close(); //xx
///xxxxxxxxxxxxxxxxxxxx

//gravaImg(img);///aqui
                    //parece que trava aqui  jgi0949gjidjjjgenbnnon
                    //dfffefesfe
                    //fesfsxxxxxxxxxxxxxxxx
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "não foi possivel encontrar " + "o dispositivo para a captura da imagem.");

                                       }
}

}
private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

JOptionPane.showMessageDialog(null, Programador Jean Ricier - Acesso remoto a webcam J2se e j2me);

Thread.interrupted();

}
private void jMenu1MouseClicked(java.awt.event.MouseEvent evt) {

// TODO add your handling code here:

JOptionPane.showMessageDialog(null, Programador Jean Ricier - Acesso remoto a webcam J2se e j2me);

Thread.interrupted();

}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

sair=1;

player.close();

new JFrame();

Thread.interrupted();

}

public void gravaImg (Image imagem) throws IOException{
 Image img1=null;
 BufferedImage img=null;

try {

//   ImageIO.write((RenderedImage) imagem, "jpg", new File(caminho));
          ServerSocket s=new ServerSocket(8189);
          Socket incoming=s.accept();
          OutputStream os=incoming.getOutputStream();
          img=(BufferedImage) imagem;

// BufferedImage new_img = new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);
BufferedImage new_img = new BufferedImage(300, 200, BufferedImage.TYPE_3BYTE_BGR);

Graphics2D g = new_img.createGraphics();
          g.drawImage(imagem, 0, 0, 300, 200, null);

   ImageIO.write(new_img, "png", os);

//sem isso nao roda cai no exeption
os.close(); //xx
s.close(); //xx
///xxxxxxxxxxxxxxxxxxxx
}

catch (IOException e) {

JOptionPane.showMessageDialog(null, "não foi possivel encontrar " + o dispositivo para a captura da imagem.);

e.printStackTrace();

}

captura();//////e aqui e aqui o problemafjfjdskkfsjfskk
////f/df/sf/sf/ss/f/f/f/f/f/f/f/

}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
// End of variables declaration

}

ViniGodoy

Ao postar código, por favor, use a tag code:

Seu código

Senão fica impossível de ler.

Se for postar muito código, use a opção de attachments.

Para que as coisas não travem, você precisa disparar o processamento do seu socket em outra thread.

J

[color=red]vlw ViniGodoy, deu certo, agora os botoes funcionam[/color]

Criado 21 de julho de 2010
Ultima resposta 28 de jul. de 2010
Respostas 13
Participantes 2