内容


现在展示:您自己的在线 MPEG-4 影院

了解 IBM MPEG-4 SDK 工具包中现成的 Java 组件

Comments

通过网络向大量用户提供互动多媒体体验不再是梦。因为天价的通信成本,以及大多数 PC 无法实时对高压缩比的视频文件进行解码,早期的尝试遭受阻碍。现在,随着广泛可用的宽带 Internet 的普及,以及 PC 微处理器性能的不断提高,所有障碍都已经清除。

MPEG-4 是一组国际标准,可用于在网络上存储、制作、编码和发放互动多媒体内容等(请参阅侧栏 MPEG-4 知识扩展)。直到最近,对于 MPEG-4 核心技术的访问一直受到极大地限制。多数 MPEG-4 的体验者一直都是一些压缩算法的研究人员、消费类电子产品设计工程师,以及专用软件的开发人员。

IBM alphaWorks 提供了 IBM MPEG-4 工具包以及配套的软件开发包(SDK),它们使得有一台支持 Java 2 平台的 PC 机的任何用户都可以访问 MPEG-4 技术。该工具包提供了一套可编程、可重用的 Java 软件组件和工具,可以用它们来创建 MPEG-4 播放器和处理 MPEG-4 内容。您可以立即采用这组生产质量工具。

本文将带您经历一次快速培训,让您了解用 SDK 及其工具包可以做什么。首先我们将用 SDK 库编写一个定制的 Java MPEG-4 播放器。然后再用 applet 创建一个随需下载的 MPEG-4 播放器。最后,将学习发布 MPEG-4 内容的不同方式,并了解工具包中可以帮助您准备发布内容的工具。

创建定制 MPEG-4 播放器

用 MPEG-4 工具包的 SDK 创建一个定制 MPEG-4 电影播放器非常简单,只需极少一点 Java 编码即可。图 1 显示了一个定制的 MPEG-4 播放器“developerWorks Cinema”:

图 1. 定制的 MPEG-4 播放器
定制的 developerWorks MPEG-4 播放器
定制的 developerWorks MPEG-4 播放器

您可以执行代码发行(请参阅 下载部分)中的批处理文件 player.bat,来试用这个播放器。您还会找到 surf.mp4文件,这是一个 MPEG-4 视频文件,这样就可以立刻开始播放电影了。请记住,在启动播放器之前,要把必需的文件 IBMMpeg4SDKL1.jar 复制到 lib 目录中(有关下载工具包的信息,请参阅侧栏 IBM MPEG-4 SDK 工具包下载。)

请注意图 1 中电影播放器窗口的标题,以及电影屏幕上的定制 logo。通过称为 player.prop 的属性文件,可以为播放器提供这些标题,如清单 1 所示:

清单 1. 用 player.prop 定制 MPEG-4 播放器
movie=surf.mp4
ttitle=developerWorks Cinema
htitle=<html><font size=+1 color=white>developer</font><font size=+2
   color=white>Works</font><font size=+1 color=yellow> Cinema</font></html>
width=320
height=340

在清单 1 中,属性 htitle 是一个 HTML 字符串,这个字符串被传递到 Java Swing JLabel 组件中。JLabel 能够直接渲染 HTML,生成图 1 中的“developerWorks Cinema” logo。

不需要重新编译播放器的源代码,只需修改 player.prop 文件中的属性,就可以完全重新配置这个播放器。表 1 描述了其中的属性:

表 1. player.prop 文件中的属性

属性说明
movie 要播放的 MPEG-4 电影的文件位置或 URL
ttitle 在播放器窗口的标题栏上显示的文本标题
htitle 在影院屏幕顶部显示的基于 HTML 的标题
width, height 播放器窗口的宽度和高度

源代码由一个类构成,它是 com.ibm.dw.mpeg4.MoviePlayer,如清单 2 所示:

清单 2. 可以定制的 MoviePlayer 的源代码
package com.ibm.dw.mpeg4;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import player.*;
public class MoviePlayer extends JFrame {
    private static final String PROP_FILE_NAME = "player.prop";
    private static final String MOVIE_PROP_NAME= "movie";
    private static final String TEXTTITLE_PROP_NAME = "ttitle";
    private static final String HTMLTITLE_PROP_NAME = "htitle";
    private static final String WIDTH_PROP_NAME = "width";
    private static final String HEIGHT_PROP_NAME = "height";
    private JPanel logoPanel;
    private PlayerControl Player;
    
    public MoviePlayer(String txtName, String htmlName, int Width, int Height) {
        Player = PlayerFactory.createMPEG4Player();
        logoPanel = new JPanel();
        
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {exit();}
        });
        
        getContentPane().setLayout(new BorderLayout());
        
        Player.setAutoSize(false);
        logoPanel.setBackground(Color.BLACK);
        logoPanel.add( new JLabel( htmlName));
        
        getContentPane().add( BorderLayout.NORTH, logoPanel);
        setTitle(txtName);
        setSize(Width , Height);
        show();
    }
    
    
    
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        FileInputStream fis =
        new FileInputStream(PROP_FILE_NAME);
        prop.load(fis);
        String movieName =
        prop.getProperty(MOVIE_PROP_NAME);
        
        MoviePlayer app = new MoviePlayer(
        prop.getProperty(TEXTTITLE_PROP_NAME), 
        prop.getProperty(HTMLTITLE_PROP_NAME),
        getIntProp(prop, WIDTH_PROP_NAME, 300),
        getIntProp(prop, HEIGHT_PROP_NAME, 200)
        );
        
        if (movieName != null)
            app.playMovie(movieName);
    }
    
    
    private  void playMovie(String loc)  throws Exception {
        getContentPane().add(BorderLayout.CENTER, Player.getRendererComponent());
        validate();
        Player.open(loc);
        Player.start();
    }
    
    
    private void exit() {
        Player.stopUrl();
        remove(Player.getRendererComponent());
        dispose();
        System.exit(0);
    }
    
    private static int getIntProp(Properties prop, String name, int defaultVal) {
        String tmpValue = prop.getProperty( name);
        int retval = defaultVal;
        if (tmpValue != null) {
            try {
                retval = Integer.parseInt(tmpValue);
            }
            catch (Exception ex) {
             /* fall through with retval=0 */
            }
        }
        return retval;
    }
    
}

在清单 2 中, MoviePlayer 由 Swing 的组件组成。 com.ibm.dw.mpeg4.MoviePlayer 是一个 JFrame。图 2 显示了 MoviePlayer 中组件的布局:

图 2. MoviePlayer 的 Swing 组件的布局
Swing components layout of Movie播放器
Swing components layout of Movie播放器

两个必需的 SDK 库类/接口:

  • Player.PlayerFactory 包含 MPEG4 播放器的实例。
  • Player.PlayerControl 是用来访问播放器实例的接口。

图 3 显示了 清单 2 中的代码如何创建、编辑定制的 MPEG-4 播放器:

图 3. 创建定制 MPEG-4 播放器
创建定制 MPEG-4 播放器
创建定制 MPEG-4 播放器

在图 3 中可以看到,只能通过 PlayerControl 接口访问库的 MPEG-4 播放器实例。要获得播放器实例,则必须在 MoviePlayer 构造函数的第一行中调用 PlayerFactory 类的静态工厂方法:

Player = PlayerFactory.createMPEG4Player();

PlayerControl 接口有许多用来控制播放器的行为的方法。获得显示电影的 GUI 组件也要使用该接口。表 2 显示了 PlayerControl 接口中最常用的一些方法:

表 2. PlayerControl 接口的方法

方法说明
setAutoSize() 决定播放器是否要强制容器改变大小。在示例中,它被设置为 false
getRendererComponent() 获得基于 java.awt.Component 的对象,可以用它来显示电影
open() 打开 MPEG-4 内容,为回放做好准备
start() 开始回放内容。电影在 renderer 组件中显示

至于详细的说明和 PlayerControl 接口中的其他方法,请参阅 SDK 的 Javadoc。

要在影院屏幕上显示 MPEG-4 电影,必须调用 PlayerControl 接口的 getRendererComponent() 方法。该方法调用返回一个 java.awt.Component 组件。以下代码包含在 清单 2playMovie() 方法中,它使 java.awt.Component 成为 MoviePlayer JFrame 的子组件:

getContentPane().add(BorderLayout.CENTER, Player.getRendererComponent());

创建基于 applet 的播放器

独立的播放器可以播放硬盘或网络上的视频文件,但是在用户的 PC 机上必须先安装播放器软件。如果您正在通过多媒体 DVD 或 CD-ROM 发布演示,那么这不成问题。但是如果多数用户要通过 Internet 访问您的演示,那么您最好采用瘦客户机的随需下载解决方案。

在瘦客户机解决方案中,用户只需要一个浏览器就可以观看视频。当浏览器浏览到您的影院 Web 页时,就会按以下顺序执行操作:

  1. 将一个小的、简化版的查看器(一个 applet)下载到用户的机器上。
  2. 启动用户机器上的 JVM,执行查看器 applet。
  3. 查看器连接回 Web 服务器(或者同一台机器上的流媒体服务器),访问网络视频。

要创建瘦客户端解决方案,需要下载 IBMAppletForMpeg4 xxxx.zip 中的两个 JAR 文件(请参阅侧栏 IBM MPEG-4 SDK 工具包下载)。使用 SDK 创建定制 applet 解决方案是有可能的,但是,本文将使用 applet 包:

  • IBMAppletForMpeg4.jar 包含一个轻量级 applet 播放器,可以播放通过 HTTP 协议提供的 MPEG-4 文件。MPEG-4 文件的格式应当是 IBM 交替存储格式(请参阅本文后面的 通过 HTTP 基于 Web 服务器的发布)。
  • IBMISMAAppletForMpeg4.jar 包含一个轻量级 applet 播放器,可以播放通过兼容 ISMA(Internet Streaming Media Alliance -ISMA)的流媒体服务器提供的 MPEG-4 视频文件,通常使用实时流式传输协议(Real Time Streaming Protocol,RTSP)和实时传输协议(Realtime Transport Protocol,RTP)(请参阅侧栏 RTSP/RTP)。

我将展示的示例使用了来自 IBMAppletForMpeg4.jar 文件的 HTTP 协议 applet。请将这个 applet 嵌入到 Web 页 dwcinema.html 文件中,如清单 3 所示:

清单 3. 使用 M4AppletA 的瘦客户端播放器实现
<html>
<head>
  <title>developerWorks Cinema</title>
  <style>
  h1 { 
     color:white;   
     font-weight:normal; 
     font-size:20pt; 
     font-family:arial,helv,helvetica,sans-serif;
     }
  </style>
</head>
<body bgcolor="black">
  <h1>
    developer<b>Works</b> <font color="yellow">Cinema</font>   
  </h1>
  <applet code="M4Applet.class" archive="IBMAppletForMpeg4.jar"
    width="320" height="300">
    <param name="url"  value="surf.m4x" />   
    <param name="panel"  value="None" />
  </applet>
</body>
</html>

在清单 3 中,使用 <applet> 标签把 Java applet 嵌入页面。 <applet> 标签的几个属性将告诉浏览器和 Java 插件(请参阅 参考资料)如何显示 applet:

  • code:将执行的 Java 类。该类必须是 java.applet.Applet 的子类。在清单 3 的示例中,M4Applet Player 是将运行的类。
  • archive:用来定位可执行 applet 类的 JAR 文件。清单 3 使用的是 IBMAppletForMpeg4.jar 文件。
  • width, height:在浏览器的显示区域中为显示 MPEG-4 电影播放器 applet 而保留的宽度和高度,以像素为单位。

将以下参数放在 <applet> 标签中,然后对 applet 进行配置,applet 在初始化时会使用这些参数:

  • url:指向要播放的电影的 URL。在 清单 3 中,它指向交替存储格式的 MPEG-4 电影。
  • panel:控制面板的配置。它可以使用的值是: NoneMiniBasicDefault。当控制面板可视的时候,可以让用户控制回放(启动、停止、暂停、静音等)。

按以下步骤试用 applet 播放器:

  1. 以二进制模式,通过 FTP 把 surf.m4x MPEG-4 视频文件和 IBMAppletForMpeg4.jar 库传输到 Web 服务器中。
  2. 以 ASCII 模式,通过 FTP 把 dwcinema.html 文件传输到 Web 服务器上的相同目录中。
  3. 在客户机上使用 Web 浏览器访问 Web 服务器上的 dwcinema.html 文件。

图 4 显示了在 Internet Explorer 中访问 applet 播放器的效果:

图 4. 在 Internet Explorer 上 Applet 随需应变播放器的效果
在 Internet Explorer 上 Applet 随需应变播放器的效果
在 Internet Explorer 上 Applet 随需应变播放器的效果

图 5 显示了从客户端使用 Netscape 7 访问同一个 applet 播放器的效果:

图 5. 在 Netscape 7 上 Applet 随需应变播放器的效果
在 Netscape 7 上 Applet 随需应变播放器的效果
在 Netscape 7 上 Applet 随需应变播放器的效果

准备发布的 MPEG-4 内容

MPEG-4 电影的来源可以是:

  • 存储介质,例如CD-ROM,DVD-ROM 或者硬盘。
  • Web 服务器(例如 Apache)支持的网络连接(请参阅 参考资料)。
  • 专门的流媒体服务器(例如 Darwin)支持的网络连接(请参阅 参考资料)。

从存储介质回放的 MPEG-4 内容不需要任何特殊准备。但是,根据传输的方法不同,需要为通过网络回放的 MPEG-4 内容进行不同的准备。

通过 HTTP 基于 Web 服务器的发布

如果通过 Web 服务器提供 MPEG-4 内容服务,那么首先要把内容转变成交替存储格式。MPEG-4 工具包支持 IBM 特定的交替存储格式,基于 MPEG-4 标准的 M4Mux 交替存储方式很适合通过 HTTP 的发布。这种格式的文件的扩展名是 .m4x,与您在 applet 示例中看到的视频文件 surf.m4x 的扩展名相同。可以用 MPEG-4 工具包中的工具 AVgen 把普通的 MPEG-4 文件转换成这种交替存储格式。

使用 Web 服务器发布 MPEG-4 内容具有以下优势:

  • 成本低。
  • 不需要专门的流媒体服务器。
  • 即使廉价的共享主机服务也能工作。
  • HTTP 能通过大多数防火墙,为您的内容提供更多的用户。
  • 设置和操作起来容易,正如 applet 的示例所演示的那样。

通过 RTSP/RTP 进行的流服务器发布

如果使用流媒体服务器,那么需要使用符合 ISMA 的服务器,通过 RTSP/RTP 协议发布 MPEG-4 内容(请参阅侧栏 RTSP/RTP ISMA 和 3GPP)。在这种情况下,必须先通过 背景环境 准备 MPEG-4 文件。背景环境为服务器的内容添加了媒体流所必需的索引和其他信息。原始的 MPEG-4 视频和音频内容必须符合两个 ISMA 标准中的一个(请参阅侧栏 ISMA 和 3GPP)。可以用工具包中的工具 AVgen 提供一个 MPEG-4 文件,然后通过流媒体服务器对其进行回放。

RTSP 和 RTP 协议是专门为 IP 网络上的媒体流设计的,它们具有以下优势:

  • 媒体流可以快进或后退,回放可以在媒体的任何一点开始。
  • 与基于 HTTP 的发布相比,可以更有效地利用带宽。
  • 也可以用它们传输即时压缩的内容流,例如现场直播。

除了为 HTTP 发布创建 .m4x 交替存储格式的文件,为流发布提供符合 ISMA 的文件之外,工具包的 AVgen 工具还可以为通过移动网络进行的 3GPP 发布提供 MPEG-4 文件。(请参阅侧栏 ISMA 和 3GPP)。

MPEG-4 内容不仅仅是视频和音频

虽然 MPEG 通常与视频和音频压缩联系在一起,但是 MPEG-4 标准还包含许多其他元素(流):

  • 2D 图形,包括以多种字体表现的演示质量的文本。
  • 3D 图形(在目前的工具包仅完成了有限的一些实现)。
  • 动画。
  • 进行用户交换的元素。
  • 嵌入式 Java 代码(在当前工具包中尚未实现)。

XMT-O 高级场景生成语言让您可以把场景效果、2D 图形、动画和用户交互加入 MPEG-4 演示(请参阅侧栏 BIFS 和 XMT)。您可以用 IBM MPEG-4 工具包中的工具 XMTBatch 作为 XMT 程序的开发环境。有关的详细内容,请参阅工具包的文档。

结束语

alphaWorks MPEG-4 工具包 SDK 中的 Java 组件使得将 MPEG-4 视频文件添加到任何项目中变得很容易。您既可以创建定制的独立播放器,也可以创建不需要在用户机器上安装播放器的轻量级 applet。还可以把 MPEG-4 内容保存为 .m4x 交替存储格式,这样,普通的 Web 服务器就可以通过 HTTP 发布 MPEG-4。您也可以用符合 ISMA 的服务器进行高质量的、可以随机访问的 RTSP/RTP 流发布。最终,对 Java 开发人员来说,通过网络进行视频发布成为了一件容易的事。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=49145
ArticleTitle=现在展示:您自己的在线 MPEG-4 影院
publish-date=11022004