UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

84 lines (80 loc) 12.2 kB
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Java Media Framework</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="Java Media Framework"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-21-SECT-6"/>Java Media Framework</h1></div></div></div><p><a id="idx11121" class="indexterm"/> <a id="idx11132" class="indexterm"/> <a id="idx11133" class="indexterm"/>Get some popcorn—Java can play movies! To do this, though, we’ll need one of Java’s standard extension APIs, the Java Media Framework (JMF). The JMF defines a set of interfaces and classes in the <a id="I_indexterm21_id819580" class="indexterm"/><code class="literal">javax.media</code> and <a id="I_indexterm21_id819591" class="indexterm"/><code class="literal">javax.media.protocol</code> packages. You can download the latest JMF from <a class="ulink" href="http://bit.ly/YWPAUk">Oracle’s website</a>. To use the JMF, add <a id="I_indexterm21_id819609" class="indexterm"/><span class="emphasis"><em>jmf.jar</em></span> to your classpath. Or, depending on what version of the JMF you download, a friendly installation program may do this for you.</p><p>We’ll only scratch the surface of JMF here, by working with an important interface called <a id="I_indexterm21_id819622" class="indexterm"/><code class="literal">Player</code>. Specific implementations of <code class="literal">Player</code> deal with different media “container” types, such as Apple QuickTime (<span class="emphasis"><em>.mov</em></span>) and Windows Video (<span class="emphasis"><em>.avi</em></span>). For a full list of supported media types and codecs, consult the latest JMF documentation. There are also players for audio types, including MP3. <code class="literal">Player</code>s are handed out by a high-level class in the JMF called <a id="I_indexterm21_id819654" class="indexterm"/><code class="literal">Manager</code>. One way to obtain a <code class="literal">Player</code> is to specify the URL of a movie.</p><p>What about Windows media player format as well as MP3?</p><a id="I_21_tt1205"/><pre class="programlisting"> <code class="n">Player</code> <code class="n">player</code> <code class="o">=</code> <code class="n">Manager</code><code class="o">.</code><code class="na">createPlayer</code><code class="o">(</code><code class="n">url</code><code class="o">);</code></pre><p>Because video files are so large and playing them requires significant system resources, <code class="literal">Player</code>s have a multistep lifecycle from the time they’re created to the time they actually play something. We’ll look at only one step, <span class="emphasis"><em>realizing</em></span>. In this step, the <code class="literal">Player</code> determines (by looking at the media file) the system resources that it needs to play the media file.</p><a id="I_21_tt1206"/><pre class="programlisting"> <code class="n">player</code><code class="o">.</code><code class="na">realize</code><code class="o">();</code></pre><p>The <code class="literal">realize()</code> method returns right away; it kicks off the realizing process in a separate thread. When the <code class="literal">Player</code> is finished realizing, it sends out an event. Once you receive this event, you can obtain one of two <code class="literal">Component</code>s from the <code class="literal">Player</code>. The first is a visual component that, for visual media types, shows the media. The second is a control component that provides a prefab user interface for controlling the media presentation. The control normally includes start, stop, and pause buttons, along with volume controls and attendant goodies.</p><p>The <code class="literal">Player</code> has to be realized before you ask for these components so that it has important information, like how big the component should be. After that, getting the component is easy. Here’s an example:</p><a id="I_21_tt1207"/><pre class="programlisting"> <code class="n">Component</code> <code class="n">c</code> <code class="o">=</code> <code class="n">player</code><code class="o">.</code><code class="na">getVisualComponent</code><code class="o">();</code></pre><p>Now, we just need to add the component to the screen somewhere. We can play the media right away (although this actually moves the <code class="literal">Player</code> through several other internal states):</p><a id="I_21_tt1208"/><pre class="programlisting"> <code class="n">player</code><code class="o">.</code><code class="na">start</code><code class="o">();</code></pre><p>The following example, <code class="literal">MediaPlayer</code>, uses the JMF to load and display a movie or audio file from a specified URL:</p><a id="I_21_tt1209"/><pre class="programlisting"> <code class="c1">//file: MediaPlayer.java</code> <code class="kn">import</code> <code class="nn">java.awt.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">java.net.URL</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.swing.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.media.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">MediaPlayer</code> <code class="o">{</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code> <code class="n">String</code><code class="o">[]</code> <code class="n">args</code> <code class="o">)</code> <code class="kd">throws</code> <code class="n">Exception</code> <code class="o">{</code> <code class="kd">final</code> <code class="n">JFrame</code> <code class="n">frame</code> <code class="o">=</code> <code class="k">new</code> <code class="n">JFrame</code><code class="o">(</code><code class="s">"MediaPlayer"</code><code class="o">);</code> <code class="n">frame</code><code class="o">.</code><code class="na">setDefaultCloseOperation</code><code class="o">(</code> <code class="n">JFrame</code><code class="o">.</code><code class="na">EXIT_ON_CLOSE</code> <code class="o">);</code> <code class="n">URL</code> <code class="n">url</code> <code class="o">=</code> <code class="k">new</code> <code class="n">URL</code><code class="o">(</code> <code class="n">args</code><code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">);</code> <code class="kd">final</code> <code class="n">Player</code> <code class="n">player</code> <code class="o">=</code> <code class="n">Manager</code><code class="o">.</code><code class="na">createPlayer</code><code class="o">(</code> <code class="n">url</code> <code class="o">);</code> <code class="n">player</code><code class="o">.</code><code class="na">addControllerListener</code><code class="o">(</code> <code class="k">new</code> <code class="n">ControllerListener</code><code class="o">()</code> <code class="o">{</code> <code class="kd">public</code> <code class="kt">void</code> <code class="nf">controllerUpdate</code><code class="o">(</code> <code class="n">ControllerEvent</code> <code class="n">ce</code> <code class="o">)</code> <code class="o">{</code> <code class="k">if</code> <code class="o">(</code> <code class="n">ce</code> <code class="k">instanceof</code> <code class="n">RealizeCompleteEvent</code> <code class="o">)</code> <code class="o">{</code> <code class="n">Component</code> <code class="n">visual</code> <code class="o">=</code> <code class="n">player</code><code class="o">.</code><code class="na">getVisualComponent</code><code class="o">();</code> <code class="n">Component</code> <code class="n">control</code> <code class="o">=</code> <code class="n">player</code><code class="o">.</code><code class="na">getControlPanelComponent</code><code class="o">();</code> <code class="k">if</code> <code class="o">(</code> <code class="n">visual</code> <code class="o">!=</code> <code class="kc">null</code> <code class="o">)</code> <code class="n">frame</code><code class="o">.</code><code class="na">add</code><code class="o">(</code> <code class="n">visual</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">CENTER</code> <code class="o">);</code> <code class="n">frame</code><code class="o">.</code><code class="na">add</code><code class="o">(</code> <code class="n">control</code><code class="o">,</code> <code class="n">BorderLayout</code><code class="o">.</code><code class="na">SOUTH</code> <code class="o">);</code> <code class="n">frame</code><code class="o">.</code><code class="na">pack</code><code class="o">();</code> <code class="n">frame</code><code class="o">.</code><code class="na">setVisible</code><code class="o">(</code> <code class="kc">true</code> <code class="o">);</code> <code class="n">player</code><code class="o">.</code><code class="na">start</code><code class="o">();</code> <code class="o">}</code> <code class="o">}</code> <code class="o">});</code> <code class="n">player</code><code class="o">.</code><code class="na">realize</code><code class="o">();</code> <code class="o">}</code> <code class="o">}</code></pre><p>This class creates a <code class="literal">JFrame</code> that holds the media. Then, it creates a <code class="literal">Player</code> from the URL specified on the command line and tells the <code class="literal">Player</code> to <code class="literal">realize()</code>. There’s nothing else we can do until the <code class="literal">Player</code> is realized, so the rest of the code operates inside a <code class="literal">ControllerListener</code> after the <code class="literal">RealizeCompleteEvent</code> is received.</p><p>In the event handler, we get the <code class="literal">Player</code>’s visual and controller components and add them to the <code class="literal">JFrame</code>. We display the <code class="literal">JFrame</code> and, finally, we play the movie. It’s very simple!</p><p>To use the <code class="literal">MediaPlayer</code>, pass it the URL of a movie or audio file on the command line. Here are a couple of examples:</p><a id="I_21_tt1210"/><pre class="programlisting"> <code class="o">%</code> <strong class="userinput"><code><code class="n">java</code> <code class="n">MediaPlayer</code> <code class="nl">file:</code><code class="n">dancing_baby</code><code class="o">.</code><code class="na">avi</code></code></strong> <code class="o">%</code> <strong class="userinput"><code><code class="n">java</code> <code class="n">MediaPlayer</code></code></strong><strong class="userinput"><code><code class="nl">http:</code><code class="c1">//myserver/mp3s/TheCure/KissMe/catch.mp3</code></code></strong></pre><p><a class="xref" href="ch21s06.html#learnjava3-CHP-21-FIG-7" title="Figure 21-7. Image of the dancing baby AVI">Figure 21-7</a> shows the “dancing baby” AVI running in the MediaPlayer. Feel free to dance along if you want.<a id="I_indexterm21_id819903" class="indexterm"/><a id="I_indexterm21_id819910" class="indexterm"/><a id="I_indexterm21_id819917" class="indexterm"/></p><div class="figure"><a id="learnjava3-CHP-21-FIG-7"/><div class="figure-contents"><div class="mediaobject"><a id="I_21_tt1211"/><img src="httpatomoreillycomsourceoreillyimages1707704.png.jpg" alt="Image of the dancing baby AVI"/></div></div><p class="title">Figure 21-7. Image of the dancing baby AVI</p></div></div></body></html>