epubjs
Version:
Render ePub documents in the browser, across many devices
84 lines (80 loc) • 12.2 kB
HTML
<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>