现在展示:您自己的在线 MPEG-4 影院
内容:
[url=http://www-128.ibm.com/developerworks/cn/java/j-mpeg4/index.html#N10076]创建定制 MPEG-4 播放器
相关内容:
IBM Toolkit for MPEG-4 (downloads)
Design skinnable Java UIs for media players with native performance
IBM developer kits for the Java platform (downloads)
订阅:
了解 IBM MPEG-4 SDK 工具包中现成的 Java 组件
级别: 初级
本文来自:http://www-128.ibm.com/developerworks/cn/java/j-mpeg4/index.html
作者, Wrox Press
2004 年 11 月 02 日
您认为通过网络向大量用户发布多媒体体验是不可能的吗?请再想想!宽带连接的广泛分布和随处可得的强大 PC,已经使得通过网络发送视频和多媒体内容成为现实。只要添加 IBM alphaWorks 的 MPEG-4 工具包,您现在就可以创建自己的 Web 影院。知名作者兼 Java 开发人员 Sing Li 将向您展示如何用 SDK 库对定制 Java MPEG-4 播放器进行编码,如何用 applet 创建随需下载(download-on-demand)的 MPEG-4 播放器,以及如何准备发布内容。通过网络向大量用户提供互动多媒体体验不再是梦。因为天价的通信成本,以及大多数 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”:
MPEG-4 知识扩展
活动图片专家组(MPEG)是国际标准化组织(ISO)的一个工作小组。该小组创建了 MPEG-1 规范,形成流行的视频 CD (VCD)格式,创建了 MPEG-2 规范,该规范产生了现在流行的数字多功能磁盘(DVD)格式和 MP3 音频格式。MPEG-4 标准解决了互动多媒体内容在网络上或在存储介质上的创建、编辑、编码和发布等问题。
主流消费类电子产品厂商的新设备(包括许多 DVD 播放器)都支持 MPEG-4 回放。数码相机和数码摄像机(DV)一般都有 MPEG-4 影像捕捉的能力。而新一代的基于 MPEG-4 的数码相机和摄像设备即将面市。这些新设备是完全固态的摄像机,非常适合掌上使用。
图 1. 定制的 MPEG-4 播放器
您可以执行代码发行(请参阅 下载部分)中的批处理文件 player.bat,来试用这个播放器。您还会找到 surf.mp4文件,这是一个 MPEG-4 视频文件,这样就可以立刻开始播放电影了。请记住,在启动播放器之前,要把必需的文件 IBMMpeg4SDKL1.jar 复制到 lib 目录中(有关下载工具包的信息,请参阅侧栏 IBM MPEG-4 SDK 工具包下载。)
IBM MPEG-4 工具包下载
在该工具包的下载站点上,有许多可以下载的二进制软件包(请参阅 参考资料)。对于本文中的代码,只需下载 IBMToolkitForMpeg4L1SDK xxxx.zip 和 IBMAppletForMpeg4 xxxx.zip 文件即可。( xxxx 代表文件的发布日期)但是,您可能还需要用 IBMToolkitForMpeg4 xxxx.zip 中的工具,来准备您自己的 MPEG-4 内容。本文中的代码基于 1.2.3 版的工具包。请参阅代码发行中的 README.TXT 文件,其中介绍了需要把下载 JAR 库文件放在什么地方(请参阅 下载部分)。
请注意图 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 组件的布局
两个必需的 SDK 库类/接口:
Player.PlayerFactory 包含 MPEG4 播放器的实例。 Player.PlayerControl 是用来访问播放器实例的接口。 图 3 显示了 清单 2 中的代码如何创建、编辑定制的 MPEG-4 播放器:
图 3. 创建定制 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 组件。以下代码包含在 清单 2 的 playMovie() 方法中,它使 java.awt.Component 成为 MoviePlayer JFrame 的子组件:
getContentPane().add(BorderLayout.CENTER, Player.getRendererComponent());
创建基于 applet 的播放器
独立的播放器可以播放硬盘或网络上的视频文件,但是在用户的 PC 机上必须先安装播放器软件。如果您正在通过多媒体 DVD 或 CD-ROM 发布演示,那么这不成问题。但是如果多数用户要通过 Internet 访问您的演示,那么您最好采用瘦客户机的随需下载解决方案。
在瘦客户机解决方案中,用户只需要一个浏览器就可以观看视频。当浏览器浏览到您的影院 Web 页时,就会按以下顺序执行操作:
将一个小的、简化版的查看器(一个 applet)下载到用户的机器上。 启动用户机器上的 JVM,执行查看器 applet。 查看器连接回 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)。 RTSP/RTP
实时流式传输协议(RTSP)是 Internet 工程工作组(IETF)提交的 RFC 2326 标准,由哥伦比亚大学、网景通信公司以及 RealNetworks 公司联合开发。它是在 IP 网络上传输多媒体流的控制协议。可以用 RTSP 来协调媒体类型、音频/视频编码以及传输协议。它还为媒体流提供了基于时间在回放的同时进行搜索控制的能力。通常,RTSP 要和 RTP 结合起来使用,其中 RTP 作为传输协议。RTP 是由 IETF RFC 1889 指定的,而且还是 ITU 的标准 H.255.0。
我将展示的示例使用了来自 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:控制面板的配置。它可以使用的值是: None、 Mini、 Basic 或 Default。当控制面板可视的时候,可以让用户控制回放(启动、停止、暂停、静音等)。 按以下步骤试用 applet 播放器:
以二进制模式,通过 FTP 把 surf.m4x MPEG-4 视频文件和 IBMAppletForMpeg4.jar 库传输到 Web 服务器中。
以 ASCII 模式,通过 FTP 把 dwcinema.html 文件传输到 Web 服务器上的相同目录中。
在客户机上使用 Web 浏览器访问 Web 服务器上的 dwcinema.html 文件。 图 4 显示了在 Internet Explorer 中访问 applet 播放器的效果:
图 4. 在 Internet Explorer 上 Applet 随需应变播放器的效果
图 5 显示了从客户端使用 Netscape 7 访问同一个 applet 播放器的效果:
图 5. 在 Netscape 7 上 Applet 随需应变播放器的效果
ISMA 和 3GPP
Internet Streaming Media Alliance(ISMA)是一个行业协会,它创建并推广 IP 网络上的音频流、视频流和数据标准(请参阅 参考资料)。3GPP 是第三代合作伙伴项目(the 3rd Generation Partnership Project),是国际性的电信标准机构,它为移动蜂窝电话和 PDA 创建了规范,可以通过“3G”移动电话网络在移动电话和 PDA 渲染/回放许多媒体。
准备发布的 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 的示例所演示的那样。 BIFS 和 XMT
BIFS(二进制场景格式,Binary Format for Scenes)描述了由变化的时间场景组成的视频、图片、2D 图形和 3D 图形对象。使用音频和视频一起创建 BIFS 流,这样就可以向用户提供丰富的多媒体体验,其中包括用户交互。
BIFS 几乎不可能手动进行编码。您必需使用 XMT(用 XML 表示的可扩展 MPEG-4 文本格式,Extensible MPEG-4 Textual Format in XML)来处理 BIFS 内容。XMT-A 是供 BIFS 使用的汇编语言,只不过是以 XML 的形式表示,因此更容易维护和创建。但是在 XMT-A 和 BIFS 之间存在一对一的映射,这使得 XMT-A 的级别非常低。XMT-O(O 代表 Omega)则是一个易于学习的、用来在 MPEG-4 展示内部创建 2D 图形、动画和交互元素的高级语言。XMT-O 也用 XML 表示。它的一些高级概念,如定位、同步、动画和交互等,与 SMIL(同步多媒体集成语言,Synchronized Multimedia Integration Language)2.0 类似,SMIL 是 W3C 组织推出的通用标准。XMT-O 被编译成 XMT-A,然后再被转换成 BIFS 流。IBM MPEG-4 工具包既支持用高级的 XMT-O 格式创建的内容,也支持用低级的 XMT-A 格式创建的内容。
通过 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 开发人员来说,通过网络进行视频发布成为了一件容易的事。
参考资料
您可以参阅本文在 developerWorks 全球站点上的 英文原文。
单击本文顶部或底部的 Code 图标(或请参阅 下载部分),下载本文介绍的源代码。
下载 IBM Toolkit for MPEG-4 的评估版软件组件和工具,试用本文中的代码。
可以在活动图片专家组的官方站点上找到 MPEG 的最新新闻。
请参阅 Internet Streaming Media Alliance(ISMA)的站点,了解流媒体规范以及符合规范的服务器的信息。
在 3rd Generation Partnership Project 的 Web 站点上,有关于 3GPP 媒体需求的最新信息。
请参阅 rtsp.org 的 Web 站点,了解更多有关 RTSP/RTP 的内容,还可以找到最新的符合规范的播放器和服务器的完整列表。
可以用开源 Web 服务器 Apache HTTP Server,在 HTTP 上发布 MPEG-4 内容。
Darwin Streaming Server 是一个开源流媒体服务器,它支持通过 RTSP/RTP 发布 MPEG-4 内容。
通过安装 Java Plug-in,可以给最新版本的主流浏览器添加执行 applet 的能力。
请参阅 IBM Research IBM MPEG-4 Technologies 的 Web 站点,了解更多与 IBM MPEG-4 有关的尖端项目的情况。
文章“ Design skinnable Java UIs for media players with native performance”(developerWorks,2004 年 3 月)展示了如何用 JNI( Java Native Interface)访问 SLIK 皮肤接口,这是一个 C API,它可以基于 WinAmp 风格的皮肤创建高级 UI。
在 developerWorks Java 技术专区中,可以找到有关 Java 编程各个方面的文章。
请访问 Developer Bookstore,获得技术书籍的完整清单,其中包括数百本 Java 相关主题的书籍。
下载
Name
Size
Download method
j-mpeg4-source.zip
关于下载方法的信息