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.
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
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. 😉
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ß