/*
* JMFPlayer.java
*
* Version 1.0 Sep 18, 2008
*
* Copyright notice
*
* Brief description
*
* (c) 2008 by dbreuer
*/
package de.fhkoeln.santiago.components.jmf;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerErrorEvent;
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.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JMFPlayer implements ControllerListener, MediaAction {
// Media Player
private Player player = null;
// For GUI
// component in which video is playing
private Component visualComponent;
// controls gain, position, start, stop
private Component controlComponent;
private JFrame frame;
private JPanel panel;
// For setup
private final MediaLocator videoMRL;
private boolean firstTime = true;
private int controlPanelHeight = 0;
private int videoWidth = 0;
private int videoHeight = 0;
public JMFPlayer(String pathToVideo) throws NoPlayerException, IOException {
this.videoMRL = createMediaLocator(pathToVideo);
setupPlayer();
}
public void startPlayer() {
if (player != null)
player.start();
}
public void stopPlayer() {
if (player != null) {
player.stop();
player.deallocate();
}
}
public void destroyPlayer() {
player.close();
}
/*
* (non-Javadoc)
*
* @see javax.media.ControllerListener#controllerUpdate(javax.media.ControllerEvent)
*/
public synchronized void controllerUpdate(ControllerEvent event) {
if (player == null)
return;
if (event instanceof RealizeCompleteEvent) {
int width = 640;
int height = 0;
if (visualComponent == null)
if ((visualComponent = player.getVisualComponent()) != null) {
Dimension videoSize = visualComponent.getPreferredSize();
videoWidth = videoSize.width;
videoHeight = videoSize.height;
width = videoWidth;
height += videoHeight;
visualComponent.setBounds(0, 0, videoWidth, videoHeight);
}
if (controlComponent == null)
if ((controlComponent = player
.getControlPanelComponent()) != null) {
controlPanelHeight = controlComponent.getPreferredSize().height;
height += controlPanelHeight;
}
if (controlComponent != null) {
controlComponent.setBounds(0, videoHeight, width, controlPanelHeight);
controlComponent.invalidate();
}
System.out.println("Width: " + width);
System.out.println("Heigth: " + height);
setupGUI(width, height);
} else if (event instanceof EndOfMediaEvent) {
// We've reached the end of the media; rewind and
// start over
player.setMediaTime(new Time(0));
player.start();
} else if (event instanceof ControllerErrorEvent) {
// Tell TypicalPlayerApplet.start() to call it a day
player = null;
} else if (event instanceof ControllerClosedEvent) {
panel.removeAll();
}
}
private MediaLocator createMediaLocator(String uri) throws FileNotFoundException {
MediaLocator locator = null;
if (uri.indexOf(":") > 0)
locator = new MediaLocator(uri);
if (uri.startsWith(File.separator))
locator = new MediaLocator("file:" + uri);
if (locator == null) {
throw new FileNotFoundException("The output file could not be realized with URI " + uri);
} else {
return locator;
}
}
private void setupGUI(int width, int height) {
JFrame.setDefaultLookAndFeelDecorated(true);
// Setup the frame
frame = new JFrame("Demo Player");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Setup the panel
panel = new JPanel(new BorderLayout());
panel.add(visualComponent, BorderLayout.PAGE_START);
panel.add(controlComponent, BorderLayout.PAGE_END);
// Add all Components to the frame and pack it
frame.getContentPane().add(panel);
frame.pack();
// make the frame visible
frame.setVisible(true);
// and set the size
frame.setSize(width, height);
}
private void setupPlayer() throws NoPlayerException, IOException {
player = Manager.createPlayer(videoMRL);
player.addControllerListener(this);
}
/* (non-Javadoc)
* @see de.fhkoeln.cosima.components.jmf.MediaAction#performAction()
*/
public void performAction() {
startPlayer();
}
}