Gravar Video com a API Direct Show Java (DSJ)

9 respostas
G

Boa Tarde Galera estou precisando gravar video com o DSJ mas não estou conseguindo,já consegui implementar um frame que grave foto,gostaria de ajuda para implementar o video.desde já obrigado.

segue abaixo o codigo :

package capturarfotos;

//Bibliotecas necessárias para a execução do programa.
import de.humatic.dsj.*;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

//Classe para a captura da foto, utilizando a API DirectShow
public class CapturarFotos implements java.beans.PropertyChangeListener
{
    private DSCapture graph;
    
    public static void main (String args[]){
    new CapturarFotos();
    }
    
    public CapturarFotos()
    {
        createGraph();
    }
    
    //Método que inicializa a webcam e configura a mesma em frame.
    public void createGraph()
    {
            final javax.swing.JDialog frame = new JDialog();
            frame.setTitle("Capturar Fotos");

            DSFilterInfo[][] dsi = DSCapture.queryDevices(DSCapture.SKIP_AUDIO);
            graph = new DSCapture(DSFiltergraph.DD7,dsi[0][0],false,DSFilterInfo.doNotRender(),this);

            frame.add(java.awt.BorderLayout.CENTER,graph.asComponent());

            final javax.swing.JButton btnCapture = new javax.swing.JButton("Capturar");
           

            //Configurando o botão de captura;
            btnCapture.addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e)
                {
                    if((graph.getState() == DSCapture.PREVIEW))
                    {
                        BufferedImage gravar = graph.getImage();
                        
                        Image img = gravarImagem(gravar);
                    
                        frame.dispose();
                        graph.dispose();
                    }
                    else
                    {
                        graph.setPreview();
                    }
                }
            });

            frame.add(java.awt.BorderLayout.NORTH,btnCapture);
            frame.setModal(true);
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
        
    }
    
    public void propertyChange(java.beans.PropertyChangeEvent pe)
    {
        switch(DSJUtils.getEventType(pe)){}
    }

    //Método que grava o dado capturado pela webcam.
    public Image gravarImagem(BufferedImage imagem)
    {
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        String caminho = "";

        if(fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
            caminho = fc.getSelectedFile().getAbsolutePath();
            
            try
            {
                  ImageIO.write((RenderedImage) imagem, "jpg", new File(caminho+"/fotoTeste.jpg"));
                  JOptionPane.showMessageDialog(null, "Imagem Capturada com Sucesso!");
                  return imagem.getScaledInstance(100, 100, Image.SCALE_DEFAULT);
            } 
            catch (IOException e)
            {
                  JOptionPane.showMessageDialog(null, "Não foi possivel encontrar " +
                  "o dispositivo para a captura da imagem.");
                  return null;
            }
        }else{
            return null;
        }
    }
}

9 Respostas

A

Tem esse link,
http://www.s2i.com.br/2011/04/14/gravando-videos-com-o-dsj-direct-show-java/
Aqui tem isso que vc quer e muito mais…

A

tenho problemas em capturar o audio, ele fica atrasado em relação ao video, alguem ja passou por esse problema?

G

amiltonrn:
Tem esse link,
http://www.s2i.com.br/2011/04/14/gravando-videos-com-o-dsj-direct-show-java/
Aqui tem isso que vc quer e muito mais…

Já usei esse exemplo , mas não consegui rodar nada… acho que não entendi como o cara explica.você conseguiu gravar?

A

eu consegui fazer!, se quiser eu posto o codigo!

G

manda ai 0/

A
package br.com.webcam;

import de.humatic.dsj.CaptureDeviceControls;
import de.humatic.dsj.DSCapture;
import de.humatic.dsj.DSFilterInfo;
import de.humatic.dsj.DSFiltergraph;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import javax.swing.JTabbedPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.IOException;
/**
 *
 * @author AmiLtiNhO
 */
public class Tmp extends JFrame implements ActionListener{
        CaptureDeviceControls controls = null;
        JFrame frame = new JFrame();
        JTabbedPane pane = new JTabbedPane();
        DSFilterInfo[][] dsi = null;
        DSFilterInfo[][] dsiVideo = null;
        DSFilterInfo[][] dsiAudio = null;
        DSCapture graph = null;
        JButton btnCapturar = null;
        JButton btnCancelar = null;
        JButton btnGravar = null;
        JLabel aux = null;
        
        public Tmp(){
            super();
            getContentPane().setLayout(null);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(600,600);
            dsi = DSCapture.queryDevices();
            dsiVideo = DSCapture.queryDevices(DSCapture.SKIP_AUDIO);
            dsiAudio = DSCapture.queryDevices(DSCapture.SKIP_VIDEO);
            //dsi[0][0].setPreferredFormat(1);
            //graph = new DSCapture(DSFiltergraph.RENDER_NATIVE,dsi[0][0],true,dsi[0][0], null);
            graph = DSCapture.fromUserDialog(this, DSFiltergraph.VMR7,null);
            
            if(((DSCapture) graph).getActiveVideoDevice() != null){
                controls = ((DSCapture) graph).getActiveVideoDevice().getControls();
            }
            if (controls != null) {
                for (int i = CaptureDeviceControls.BRIGHTNESS; i < CaptureDeviceControls.FOCUS; i++) {
                    try {
                        //     jf.add(controls.getController(i, 0, true));
                    } catch (Exception e) {
                        System.out.println("Erro aou inserir controle: " + controls.getController(i, 0, true));
                    }
                }
            }

            graph.asComponent().setBounds(0, 0, 590, 450);
            graph.setPreview();
            add(graph.asComponent());
            //getContentPane().add(graph.asComponent());
            
            btnGravar = new JButton("Gravar");
            btnGravar.setBounds(287, 527, 89, 23);
            getContentPane().add(btnGravar);
            
            btnCancelar = new JButton("Cancelar");
            btnCancelar.setBounds(485, 527, 89, 23);
            getContentPane().add(btnCancelar);
            
            btnCapturar = new JButton("Capturar");
            btnCapturar.setBounds(386, 527, 89, 23);
            getContentPane().add(btnCapturar);
            
            repaint();
            validate();
            addEventos();
        }
    private void addEventos() {
    	btnGravar.addActionListener(this);
    	btnCapturar.addActionListener(this);
    	btnCancelar.addActionListener(this);   
    }
    
    public void actionPerformed(ActionEvent e) {
    	if(e.getSource() == btnGravar){
    		//Verifica se o dispositivo está no status PREVIEW
    		if (graph.getState() == DSCapture.PREVIEW) {
    		   File f = new File("NewVideo.avi");
    		   graph.setCaptureFile(f.getAbsolutePath(), null, null, true);
    		   graph.record();
    		//Se não estiver, muda o status atual para PREVIEW
    		} else {
    		   graph.setPreview();
    		}
    	}
    	if(e.getSource() == btnCapturar){
    		
    		int nome = 0;
    		BufferedImage im = graph.getImage();
    		
    		try {
    			
    			 //JOptionPane.showMessageDialog(null, caminho);
    			File f = new File(nome+".jpg");
    			while(f.exists()){
    				nome = nome + 1;
    						
    				f = new File(nome+".jpg");
    			}
    			
				ImageIO.write(im, "JPG", new File(nome+".jpg"));
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
    		
    		
            
    	}
    	if(e.getSource() == btnCancelar){
    		JOptionPane.showMessageDialog(null, "parado");
    		repaint();
    		validate();
    		graph.stop();
    		graph.setPreview();
    		try {
				Thread.sleep(2000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
    		System.exit(0);
    		
    	}
    	
    }
   
	public static void main(String args[]) {
        new Tmp();
    }
}
G

Aqui ta criando um arquivo de video mas não tem nada,tipo fica com 0Kb

A

engraçado, aqui funcionou^^, tu add o .jar no projeto e add a dll na pasta do java?

G

Olha ai como ta aparecendo,eu clico em ‘‘gravar’’ ele congela a tela… isso é porque ele muda de modo de PREVIEW para modo de captura?

Criado 22 de setembro de 2013
Ultima resposta 22 de out. de 2013
Respostas 9
Participantes 2