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

来源:互联网 发布:python工程创建 编辑:程序博客网 时间:2024/05/01 08:46
现在展示:您自己的在线 MPEG-4 影院
内容:创建定制 MPEG-4 播放器创建基于 applet 的播放器准备发布的 MPEG-4 内容MPEG-4 内容不仅仅是视频和音频 结束语参考资料 下载关于作者对本文的评价相关内容:IBM Toolkit for MPEG-4 (downloads)Design skinnable Java UIs for media players with native performanceIBM developer kits for the Java platform (downloads)订阅:developerWorks 时事通讯了解 IBM MPEG-4 SDK 工具包中现成的 Java 组件

级别: 初级

本文来自:http://www-128.ibm.com/developerworks/cn/java/j-mpeg4/index.html

Sing Li
作者, 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 播放器
定制的 developerWorks 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.mp4ttitle=developerWorks Cinemahtitle=<html><font size=+1 color=white>developer</font><font size=+2   color=white>Works</font><font size=+1 color=yellow> Cinema</font></html>width=320height=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播放器

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

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

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

图 3. 创建定制 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 组件。以下代码包含在 清单 2 的 playMovie() 方法中,它使 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)。

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:控制面板的配置。它可以使用的值是: 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 随需应变播放器的效果

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

图 5. 在 Netscape 7 上 Applet 随需应变播放器的效果
在 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 相关主题的书籍。

下载
NameSizeDownload methodj-mpeg4-source.zipFTP*关于下载方法的信息
原创粉丝点击