Acessar vídeos de qualquer máquina que esteja na rede

7 respostas
M

Olá, apesar de ter acompanhado esse tópico http://www.guj.com.br/java/276867-multimidia---jmf-jni-dsj-vlcj-opencv-javacv-jna/2 e realizado pesquisas, continuo com dúvidas.

Tenho uma app que roda em rede, é um sistema de cadastro e pesquisa de filmes. O objetivo é clicar na imagem ( é exibido uma lista de imagens de filmes) e rodar o filme desejado.

Até aí ok, Utilizei O java Swing e o vlcj para isso. O problema é que quando uso outro computador da rede, consigo acessar o site, mas o vídeo só abre na máquina em que roda a app.

Como estou perdido nos conceitos, gostaria de saber o que é necessário para que o vídeo carregasse nas outras máquinas da rede que solicitassem assistir aos vídeos.

7 Respostas

E

O arquivo do vídeo pode ser acessado pelo Windows Explorer (isto supondo que seja uma rede Windows ou Samba?)

M

Sim, os vídeos estão compartilhados na rede.

E

Sabe usar a sintaxe correta para acessar arquivos na rede?

Por exemplo, se o arquivo pode ser acessado, no Windows Explorer, como \maquina\share\diretorio\diretorio\arquivo.mov, você pode usar no seu programa em Java algo como:

String nome = "\\\\maquina\\share\\diretorio\\diretorio\\arquivo.mov";

Veja se não está havendo algum problema de acesso também.

M

Sei, sim. Olha o método play(). unknown é o nome da máquina que roda a app.

public class Movie extends JFrame implements ActionListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private final String LIB_VLC_PATH = "C:\\Arquivos de programas\\VideoLAN\\VLC" ;
	
	private final String LIB_VLC_CORE_PATH = "C:\\Arquivos de programas\\VideoLAN\\VLC" ;
	
	private JPanel topPanel = new JPanel();
	
	private JPanel statusPanel = new JPanel();
	
	
	private JButton playButton = new JButton("Play");
	
	private JButton stopButton = new JButton("Stop");
	
	private JButton pauseButton = new JButton("Pause");
	
	private MediaPlayerFactory factory;
	
	private EmbeddedMediaPlayer mediaPlayer;
	
	int Video_Width = 550;
    int Video_Height = 1000;
    int Num_Video = 1;

	
	
	public Movie() {
		NativeLibrary.addSearchPath("libvlc", LIB_VLC_PATH);  
	    NativeLibrary.addSearchPath("libvlccore", LIB_VLC_CORE_PATH);  	
		final String jnaLibraryPath = System.getProperty("jna.library.path");
		final StringBuilder newJnaLibraryPath = new StringBuilder(jnaLibraryPath != null ? (jnaLibraryPath + ":") : "");
		newJnaLibraryPath.append("F:\\DESENVOLVIMENTO\\JAVA\\LIBS");
		System.setProperty("jna.library.path", newJnaLibraryPath.toString());
		playButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
                    play();				
			}
		});
		
		stopButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				parar();
				
			}
		});
		
		
		pauseButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
                 pausar();				
			}
		});
		
		
		topPanel.add(playButton);
		topPanel.add(stopButton);
		topPanel.add(pauseButton);
		
		this.setSize(1000, 800);
		
		this.setLayout(new BorderLayout());
		
		this.setVisible(true);
		
		 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 
		 JPanel mainPanel = new JPanel(new FlowLayout());
		 
		 Canvas[] videoCanvas = new Canvas[Num_Video];
		 
		 JPanel[] vidPanel = new JPanel[Num_Video];
		 
		 for (int i = 0; i < Num_Video; i++) {
			vidPanel[i] = new JPanel();
			videoCanvas[i] = new Canvas();
			vidPanel[i].setPreferredSize(new Dimension(Video_Height, Video_Width));
			vidPanel[i].setBackground(Color.black);
			vidPanel[i].setLayout(new BorderLayout());
			videoCanvas[i].setBackground(Color.black);
			vidPanel[i].add(videoCanvas[i],BorderLayout.CENTER);
			mainPanel.add(vidPanel[i]);
		}

	  factory = new MediaPlayerFactory();
	  mediaPlayer = factory.newEmbeddedMediaPlayer();
	  mediaPlayer.setVideoSurface(factory.newVideoSurface(videoCanvas[0]));
	  mediaPlayer.setPlaySubItems(true);
	 

	
	  
	  mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter(){
		  @Override
          public void mediaSubItemAdded(MediaPlayer mediaPlayer, libvlc_media_t subItem) {
              List<String> items = mediaPlayer.subItems();
              System.out.println(items);
          }
      });
 
	  this.add(topPanel, BorderLayout.SOUTH);
	  this.add(mainPanel, BorderLayout.CENTER);
	  this.add(statusPanel, BorderLayout.NORTH);
	  
	
	
	}
	
	 public void actionPerformed(ActionEvent e) throws IllegalStateException {

	        if (e.getActionCommand().equals("OK")) {
	            this.dispose();
	        }
	    }

	
	 public void start() {
	        this.setVisible(true);
	    }

	
	
	private void play(){
		 
		mediaPlayer.playMedia("\\\\unknown\\POR ATOR\\ARNOLD\\EXTERMINADOR_DO_FUTURO.mp4");
	}
	
	private void parar(){
		mediaPlayer.stop();
	}
	
	private void pausar(){
		mediaPlayer.pause();
	}
}
E
  1. Uma coisa que sei que sempre dá problemas em programas que funcionam em Windows e Unix/Linux (que é o caso do VLC) é que normalmente há problemas com arquivos e/ou diretórios com nomes com espaços. Podia renomear esse share para um que não tenha espaços?
  2. O seu programa Java não consegue obter as credenciais de autenticação, se porventura seu usuário não tiver ainda fornecido as credenciais e se elas forem necessárias. Não é trivial para um programa em Java obter as credenciais necessárias para a conexão, se ela ainda não houver sido efetuada.
M

Entendi, vou remover os espaços para testar. Depois retorno. Obrigado.

A

Olá,

Acompanhando o seu post, já havia pesquisado na internet sobre o vlcj. Consegui gravar/reproduzir áudio e vídeo com esta API, e também já encontrei diversos códigos no site do vlcj (http://code.google.com/p/vlcj/source/browse/trunk/vlcj/src/test/java/uk/co/caprica/vlcj/test/capture/CaptureTest.java).

Como minha app deve reproduzir diversos vídeos simultaneamente, conforme este exemplo (http://stackoverflow.com/questions/11078586/vlcj-creating-multiple-video-panels), procurei adaptar para minha necessidade, mas estou obtendo o erro abaixo:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at testesdiversos.Movie.<init>(Movie.java:107)
	at testesdiversos.Movie$5.run(Movie.java:165)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

O código que estou adaptando, baseado no seu (solicitando sua permissão para tal, claro…!!!), é o seguinte:

package testesdiversos;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import uk.co.caprica.vlcj.binding.internal.libvlc_media_t;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;

import com.sun.jna.NativeLibrary;

public class Movie extends JFrame implements ActionListener{

	private static final long serialVersionUID = 1L;

	private final String LIB_VLC_PATH = "C:\\Arquivos de programas\\VideoLAN\\VLC" ;
	private final String LIB_VLC_CORE_PATH = "C:\\Arquivos de programas\\VideoLAN\\VLC" ;

	private JPanel topPanel = new JPanel();
	private JPanel statusPanel = new JPanel();

	private JButton playButton = new JButton("Play");
	private JButton stopButton = new JButton("Stop");
	private JButton pauseButton = new JButton("Pause");

	private MediaPlayerFactory factory;

	private EmbeddedMediaPlayer[] mediaPlayer;

	private String[] video = {"C:\\VLCSnaps\\VideoInstitucional.wmv", "C:\\VLCSnaps\\FunnyCats.flv"};

	int Video_Width = 200; // Original = 550
	int Video_Height = 150; // Original = 1000
	int Num_Video = 2; // Orignal = 1

	public Movie() {
		NativeLibrary.addSearchPath("libvlc", LIB_VLC_PATH);  
		NativeLibrary.addSearchPath("libvlccore", LIB_VLC_CORE_PATH);  	
		final String jnaLibraryPath = System.getProperty("jna.library.path");
		final StringBuilder newJnaLibraryPath = new StringBuilder(jnaLibraryPath != null ? (jnaLibraryPath + ":") : "");
		newJnaLibraryPath.append("C:\\Arquivos de programas\\Java\\jre7\\lib");
		System.setProperty("jna.library.path", newJnaLibraryPath.toString());

		playButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				play();				
			}
		});

		stopButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				parar();
			}
		});

		pauseButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				pausar();				
			}
		});

		topPanel.add(playButton);
		topPanel.add(stopButton);
		topPanel.add(pauseButton);

		this.setSize(1000, 800);
		this.setLayout(new BorderLayout());
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel mainPanel = new JPanel(new FlowLayout());

		Canvas[] videoCanvas = new Canvas[Num_Video];
		JPanel[] vidPanel = new JPanel[Num_Video];

		for (int i = 0; i < Num_Video; i++) {
			vidPanel[i] = new JPanel();
			videoCanvas[i] = new Canvas();
			videoCanvas[i].setBackground(Color.black);
			vidPanel[i].setPreferredSize(new Dimension(Video_Height, Video_Width));
			vidPanel[i].setBackground(Color.black);
			vidPanel[i].setLayout(new BorderLayout());
			vidPanel[i].add(videoCanvas[i],BorderLayout.CENTER);
			mainPanel.add(vidPanel[i]);
		}

		factory = new MediaPlayerFactory();

		for (int i = 1; i < Num_Video; i++) {
			mediaPlayer[i] = factory.newEmbeddedMediaPlayer();
			mediaPlayer[i].setVideoSurface(factory.newVideoSurface(videoCanvas[i]));
			mediaPlayer[i].setPlaySubItems(true);
			mediaPlayer[i].addMediaPlayerEventListener(new MediaPlayerEventAdapter(){

				@Override
				public void mediaSubItemAdded(MediaPlayer mediaPlayer, libvlc_media_t subItem) {
					// List<String> items = mediaPlayer.subItems();
					List items = (List) mediaPlayer.subItems();
					System.out.println(items);
				}
			});
		}

		this.add(topPanel, BorderLayout.SOUTH);
		this.add(mainPanel, BorderLayout.CENTER);
		this.add(statusPanel, BorderLayout.NORTH);
	}

	public void actionPerformed(ActionEvent e) throws IllegalStateException {
		if (e.getActionCommand().equals("OK")) {
			this.dispose();
		}
	}


	public void start() {
		this.setVisible(true);
	}

	private void play(){
		// mediaPlayer.playMedia("\\\\unknown\\POR ATOR\\ARNOLD\\EXTERMINADOR_DO_FUTURO.mp4");

		for (int i = 0; i < Num_Video; i++) {
			mediaPlayer[i].playMedia(video[i]);
		}
	}

	private void parar(){

		for (int i = 0; i < Num_Video; i++) {
			mediaPlayer[i].stop();
		}
	}

	private void pausar(){

		for (int i = 0; i < Num_Video; i++) {
			mediaPlayer[i].pause();
		}
	
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				new Movie().start();
			}
		});
	}
}

Se tiver a possibilidade de verificar e dar alguma “dica” do que não foi inicializado ou como inicializar o que está provocando o erro, fica desde já meu agradecimento.

[]s

Criado 6 de julho de 2012
Ultima resposta 19 de abr. de 2013
Respostas 7
Participantes 3