Motion JPEG, H.264 Streams in Java

mas666

Mitglied
Hallo zusammen,

Ich möchte gerne eine Swing-Oberfläche programmieren auf der ich verschiedene MotionJPGs oder H.264-Streams darstellen möchte. Ich habe schon einiges durchprobiert und bin auf keinen grünen Zweig gekommen. Ich bin auch nicht zwingend auf Swing angewiesen und würde mich auch mit einem Applet zufrieden geben. Hat jemand bereits Erfahrungen damit?

Das ganze muss auch nicht zwingend plattformunabhängig sein.

Ist so etwas mit JMF realisierbar?

Danke und Gruss
mas
 
1. JMF kannst du in der Hinsicht vergessen. Schon allein deshalb, weil es seit 8 Jahren nicht weiterentwickelt wird. Auch die freie Variante FMJ ist zu alt.
2. Ich würde dir eher zu Bindings von VLC, GStreamer, ffmpeg und ähnlichen Video-Encodern/Playern raten. Auf welche Betriebssysteme kann sich dein Programm denn beschränken?
• VLCJ macht einen guten Eindruck: https://github.com/caprica/vlcj
• gstreamer-java auch: http://code.google.com/p/gstreamer-java/
• DSJ (directShow Java Wrapper) gibts nur für Windows: http://www.humatic.de/htools/dsj.htm
http://www.xuggle.com/xuggler ist auch Konverter, En-/Decoder, für Streams, …
3. JavaFX bietet die Möglichkeit, Filme abzuspielen. Es sollte möglich sein, JavaFX-Elemente in Swing-UIs einzubauen. Dazu muss allerdings JavaFX installiert sein, was nicht immer der Fall ist. Das ist aber sicher die zukunftsfähigste Variante, da JavaFX wahrscheinlich irgendwann mal Swing ablösen soll.
 
Hey Genodeftest

Danke für die Tipps. Ich werde zuerst VLCJ ausprobieren und melde mich mit Code-Beispiel falls es klappt.

Danke und Gruss
mas
 
Hallo

Also ich habe folgende Erfahrungen mit VLCJ gemacht.

  • Es ist möglich und ziemlich einfach MotionJPEGs und H.264 Streams darzustellen
  • Es werden dafür NativeLibraries geladen (Die sind Plattformabhängig)
  • Es ist wichtig darauf zu achten, dass man die richtigen Libraries (DLLs) hat. Ein 64-bit JDK wird immer nur mit einer 64-bit Installation von VLC laufen (Als experimental Release verfügbar)
  • Die Libraries befinden sich im Installationspfad von VLC (Default: C:\Program Files\VideoLAN\VLC)

Ich habe also einen kleinen Test gemacht wo ich einen Axis-Videoserver ein TV-Bild streamen lasse und dieses in meiner Applikation anzeige. Folgend die Klasse.

Es gilt zu beachten, dass eventuell der Pfad zu den libraries geändert werden muss und, dass das Laden der Libraries plattformabhängig ist (Windows).


Java:
package main;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

public class StreamOnlyTest {

	private final EmbeddedMediaPlayerComponent mediaPlayerComponent1;
	
	public StreamOnlyTest() {
				 
		NativeLibrary.addSearchPath( RuntimeUtil.getLibVlcLibraryName(), "C:/Program Files/VideoLAN/VLC" );
		
		String libName = RuntimeUtil.getLibVlcLibraryName();
		Native.loadLibrary(libName, LibVlc.class);
		
		mediaPlayerComponent1 = new EmbeddedMediaPlayerComponent();
		
		JFrame frame = new JFrame("vlcj Test");
		frame.setLocation(100, 100);
		frame.setSize(1024, 768);

	    frame.setContentPane(mediaPlayerComponent1);
	    
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	    
	    mediaPlayerComponent1.getMediaPlayer().playMedia("http://192.168.1.143/axis-cgi/mjpg/video.cgi");
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
		      @Override
		      public void run() {
		        new StreamOnlyTest();
		      }
		    });
	}
}

Der Output:

vlcj.png

Gutes Mini-Tutorial (Englisch): http://www.capricasoftware.co.uk/vlcj/tutorial1.php

Anmerkung: Falls eine UnsatisfiedLinkError-Exception geworfen wird liegt das daran, dass der Library-Pfad falsch ist oder, dass man versucht eine 32-bit-DLL mit einem 64-bit-JDK (oder umgekehrt) zu verwenden.

Gruss
mas
 

Neue Beiträge

Zurück