import java.applet.*; import java.awt.*; import java.net.*; import java.media.*; /** * JMFApplet uses Java Media Framework Player functionality * to load and play audio or video multimedia files or streams. *

* JMFApplet is compliant with JMF Beta spec, v0.96, Jan 1997. * * @author Bill Day * @version 1.0 * @see java.media.Player **/ public class JMFApplet extends Applet implements ControllerListener { boolean eomReached = false; boolean realized = false; URL myURL = null; Player myPlayer = null; Label status = null; Component myVisual = null; Component myControls = null; Panel visualPanel = null; /** * Initialize JMFApplet, laying out the interface, realizing the * player, prefetching the asset, and in general readying for playback. **/ public void init() { super.init(); // Specify AWT Layout Manager and pack status message into // it to tell user we are loading. setLayout (new BorderLayout()); status = new Label("Loading media asset...please wait.",Label.CENTER); add("North",status); validate(); // Load URL from web page. String asset = getParameter("ASSET"); // Check that we have a valid URL and create URL object to hold it. if (asset.equals("")) { status.setText("*Please specify one URL to play*"); } else { try { myURL = new URL(getDocumentBase(),asset); } catch (MalformedURLException e) { status.setText("*Please specify a valid URL to play*"); } } try { myPlayer = Manager.createPlayer(myURL); } catch (java.io.IOException e) { status.setText("IOException...exiting."); System.exit(1); } if (myPlayer == null) { status.setText("myPlayer is null...exiting."); System.exit(1); } //Register JMFApplet as an observer of myPlayer. myPlayer.addControllerListener(this); // The Player.realize() method is non-blocking. However, we // need to be certain we have a realized player before // continuing, so we implement and call our blockingRealize // method to ensure this. blockingRealize(); // Now that we have a Realized player, we can get the // VisualComponent and ControlPanelComponent and pack // them into our applet. myVisual = myPlayer.getVisualComponent(); if (myVisual != null) { // In order to ensure that the VisualComponent // is not resized by BorderLayout, I nest it // within visualPanel using FlowLayout. visualPanel = new Panel(); visualPanel.setLayout(new FlowLayout()); visualPanel.add(myVisual); add("Center",visualPanel); } else { remove(status); add("Center",status); status.setText("No VisualComponent available."); } myControls = myPlayer.getControlPanelComponent(); if (myControls != null) { add("South",myControls); } validate(); // Prefetch asset and we are ready to being playback! myPlayer.prefetch(); status.setText("JMF Player is ready to play "+asset); } /** * Override the default applet stop method to call myPlayer.stop() * and myPlayer.deallocate() so that we properly free up resources * if someone exits this page in their browser. **/ public void stop() { myPlayer.stop(); myPlayer.deallocate(); } /** * Since realize() is non-blocking, I've implemented this method * as a wrapper to do blocking realization. It can be called by * any method that needs to be certain that realize has occured * before preceeding. **/ public synchronized void blockingRealize() { myPlayer.realize(); while (!realized) { try { wait(); } catch (java.lang.InterruptedException e) { status.setText("Interrupted while waiting on realize...exiting."); System.exit(1); } } } /** * The controllerUpdate method is from java.media.ControllerListener, * and deals with events generated by myPlayer. This allows JMFApplet * to react to myPlayer events. **/ public synchronized void controllerUpdate (ControllerEvent event) { // Print to standard output the type of event we received. System.out.println("myPlayer generated "+event.toString()); // If the event was a RealizeCompleteEvent or EndofMediaEvent, // we want to react to it as below. if (event instanceof RealizeCompleteEvent) { realized = true; notify(); } else if (event instanceof EndOfMediaEvent) { eomReached = true; } } }