Zum Inhalt

Java und DivX bzw. XviD

Das das Java Media Framework alles andere als aktuell ist, läßt sich sehr einfach "Fobs" dazu benutzen, trotzdem "aktuelle" Codecs wie DivX und XviD decodieren zu können.


VideoFrame.java

package media;

import java.awt.BorderLayout;
import java.net.URL;

import javax.swing.WindowConstants;

public class VideoFrame extends javax.swing.JFrame {

    private static final long serialVersionUID = 6688121132497051736L;

    public static void main(String[] args) {
        VideoFrame inst = new VideoFrame();
        inst.setVisible(true);
        inst.setTitle("Java Media Player – Dennis Wilmsmann 2007");
    }

    private VideoPanel myMediaPanel;

    public VideoFrame() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            {
                URL url = new URL("http://insert a valid url here");
                myMediaPanel = new VideoPanel(url);
                getContentPane().add(myMediaPanel, BorderLayout.CENTER);
            }
            pack();
            setSize(588, 448);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


VideoPanel.java

package media;

import java.awt.Component;
import java.io.*;
import java.net.URL;

import javax.media.CannotRealizeException;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.swing.JPanel;

public class VideoPanel extends JPanel implements ControllerListener {

    private static final long serialVersionUID = -4219636495935354982L;

    Player mediaPlayer = null;

    String tempFileName = "./tempMediaFile.avi";

    public VideoPanel() {
    }

    public VideoPanel(URL mediaURL) {

        try {

            InputStream is = null;
            is = mediaURL.openStream();
            FileOutputStream out = new FileOutputStream(tempFileName);

            byte buf[] = new byte[4096];

            int length;
            while ((length = is.read(buf)) > 0) {
                out.write(buf, 0, length);
            }

            out.close();
            is.close();

            File f = new File(tempFileName);
            System.out.println("File length " + f.length());

            mediaPlayer = Manager.createRealizedPlayer(new MediaLocator(f
                    .toURL()));

            Component video = mediaPlayer.getVisualComponent();
            Component controls = mediaPlayer.getControlPanelComponent();

            if (video != null) {
                add(video);
            }

            mediaPlayer.addControllerListener(this);
            mediaPlayer.start();

        }

        catch (NoPlayerException noPlayerException) {
            System.err.println("No media player found");
        }

        catch (CannotRealizeException ex) {
            ex.printStackTrace();
        }

        catch (IOException iOException) {
            System.err.println("Error reading from the source");
        }
    }

    public void controllerUpdate(ControllerEvent e) {
        if (e instanceof EndOfMediaEvent) {
            System.exit(0);
        }
    }
}


Dazu müssen nun noch die fobs4jmf.dll und jmf.properties im selben Verzeichnis liegen und die fobs4jmf.jar in den Java Build Path integriert werden.

Published inJava

3 Comments

  1. Angelika Angelika

    Hallo,
    ich habe beide Klassen 1:1 übernommen. Leider erhalte ich die folgende Fehlermeldung: Error reading from the source
    So sieht die Einstellung bei mir aus:
    http://www.yourupload.de/show/d/931/xuq8ZUmr.jpg
    Unter Videopanel.java habe ich folgende Quelle angegeben:
    String tempFileName = „bad.mpg“;
    Wie in der Abbildung zu sehen ist, stimmt der Pfad.
    Um sicher zu gehen, habe ich auch den folgenden Pfad angegeben:
    String tempFileName = „C:/workspace/JMF/fobs/bad.mpg“;
    Hast du eine Erklärung für das Problem ?
    Gruß
    Angelika

  2. dwilmsmann dwilmsmann

    Hallo,
    hast du in der _VideoFrame.java_ die Zeile *URL url = new URL(„http://insert a valid url here“);* passend ersetzt? Das Programm ist darauf ausgelegt, ein Video von einem Webserver zu laden. Wenn nur ein lokales Video abgespielt werden soll, muss die Zwischenspeicherung in _VideoPanel.java_ auskommentiert werden. Also von *InputStream is = null;* bis *is.close(); *. Jedenfalls vermute ich das so adhoc. 😉

  3. Angelika Angelika

    Da kennt jemand sein Handwerk 🙂
    Danke, das war die Lösung !
    Kennst du zufällig eine gute Beschreibung, HowTo, Tutorial für die Anwendung von fobs4jmf ?
    Gruß

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.