你好,蓝光 3D 世界

2011 年 5 月发布

作者:Michael Lagally

想知道如何为家庭影院编写自己的 3D Java 应用程序吗?请阅读本文了解详情,本文介绍蓝光 3D 的概念和 BD-J 平台。

想像一下 3D 形式的几个大字“Hello World”在您的电视上闪烁的情形吧!当然,您可以想像在电视上显示许多更有趣的应用程序,但几乎所有编程的体验都是从“Hello World”开始。本文提供所需的基本概念和背景信息,以便您能够使用 Java 创建您的第一个 3D Hello World 应用程序。

要求

首先需要有一个 Java 平台连接到电视。好消息是您很可能已经有一个功能齐全的 Java 平台通过蓝光播放器连接到电视。最新的蓝光播放器能够显示 3D 内容,鉴于蓝光标准附带有 Java 3D API,因此您可以马上开始写程序了。

即使没有 3D 电视或蓝光播放器,您还是有办法开始开发和测试 3D 程序。如果您拥有一台 Microsoft Windows 计算机,那么您只需要免费软件和一副红/蓝眼镜(也称立体眼镜),这种眼镜只需几美元就可以买到。

 
BD-J 平台

在实际开始编码之前,您需要了解一点适用于蓝光的 Java 平台相关知识。

适用于蓝光的平台称为 BD-J。BD-J 基于 Java Platform Micro Edition (Java ME) 互连设备配置 (CDC) 的 Personal Basic Profile (PBP) 以及 Java TV 规范。该平台构建在标准化 DVB-GEM(数字视频广播 — 全球可执行多媒体家用平台)中间件之上,这个中间件还是其他电视中间件标准(如用于美国有线电视的 tru2way)的基础。BD-J 系统不仅具备 Java ME 运行时环境众所周知的各项优点,还结合了其他 UI、媒体和光盘处理 API。

您的播放器中拥有完备的 Java 平台,包括带安全套接字层 (SSL) 的网络系统,以及能够同时运行多个 Xlet 并提供 Xlet 间通信的多应用程序运行时环境、资源管理框架等等。

BD-J 应用程序就是能够与蓝光电影同步并可访问某些新 API 的 Xlet。

 
3D BD-J 应用程序

BD-J 平台最近经过扩展增加了一些 3D API,使您能够处理 3D 显示并将左眼和右眼的图像分别绘制到单独的帧缓冲区。新的 3D Profile (Profile 5) 基本上只是所连接的播放器的普通配置文件 (Profile 2) 加上以下立体 3D 扩展:

  • 新的帧顺序 3D 电影 codec (MPEG-4 MVC)

  • 支持 2D/3D 字幕信令的元数据扩展

  • 几个 BD-J API 扩展:

    • 两个新的 3D 图形显示模式
    • 新的立体绘图 Java API
    • 图形偏移序列
    • 用于查询 3D 功能的 API

以下各节将详细介绍这些 BD-J API 扩展。

新的 BD-J 3D 显示模式

蓝光 3D 模式是对绘图 API 的扩展,这为绘制 3D 场景提供了一种(有限的)手段。这些功能可以与剧场舞台效果媲美,在剧场舞台中,以不同深度设置平面背景可以给人 3D 的感觉。

有一个 API 可以查询播放器及其连接到的显示器的 3D 功能。这个 API 还用于在不同 3D 模式之间切换以及切换回 2D 模式。

用于 BD-J 的 3D API 支持两种不同的 3D 显示模式。一种称为“单平面 + 偏移”,另一种称为双平面模式。

如图 1 和 2 所示,“单平面 + 偏移”模式根本上只提供一个绘图平面,在这个平面上,您可以像在非 3D 应用程序中那样使用所有绘图 API。利用该 API,您可以在左眼和右眼的显示之间设置一个偏移量。当向左眼和右眼显示平面时,将应用此偏移量,根据偏移量为正值还是负值,将使得平面显得离您更近或更远。

单平面+偏移模式

图 1:“单平面+偏移”模式

由于偏移总是作用于整个平面,因此所有图形对象显示在同一深度;不可能将各个项置于不同的深度。因为只有一个帧缓冲区,对它进行平移,无需同步任何绘制操作,所以可以使用一直用于 2D BD-J 应用程序的所有基于 Abstract Window Toolkit (AWT) 的绘制操作。因此,可以比较轻松地对现有 BD-J 应用程序代码进行修改以使用“单平面 + 偏移”模式。

单平面 + 偏移模式下的绘图模型

图 2:“单平面 + 偏移”模式下的绘图模型

如图 3 和 4 所示,双平面模式提供两个全尺寸的屏幕缓冲区,分别用于左眼和右眼。普通的绘图 API 不能在双平面模式下工作,因为无法保证同步绘制到两个帧缓冲区上。

于是提供了一个新的绘图 API,该 API 提供了一些对左右屏幕窗格执行同步位图传送的方法。应用程序先绘制到屏幕外缓冲区,然后使用 drawStereoscopic API 同时更新左右帧缓冲区。此 API 支持将对象放置在不同的感知深度,因此双平面模式可用于创建更高级的 3D 场景。应注意,您仍然使用全套的 AWT 绘制操作来呈现到屏幕外缓冲区。

双平面模式

图 3:双平面模式

由于可以将各个对象放置在不同的深度,双平面模式的灵活性最高,适用于高级菜单、动画、游戏等等。但是请注意:此模式所处理的仍然只是 2D 形状,不是 OpenGL (JSR 239) 方式的全容积三维 API。

双平面模式下的绘图模型

图 4:双平面模式下的绘图模型

drawStereoscopic API 详细信息

用于在双平面模式下进行立体绘图的 API 提供了两种绘制方法。在简单形式下,它只采用两个图像和两组更新矩形。调用时,该 API 保证至少将更新区域的内容复制到左眼和右眼的帧缓冲区。通过指定更新矩形,可以大大减轻播放器的重绘负担。如果要复制整个图像,只需使用 NULL。

public void drawStereoscopic( 
     java.awt.Image left, 
           int leftX, int leftY, 
           java.awt.Rectangle[] leftUpdateAreas,
   java.awt.Image right, 
           int rightX, int rightY, 
           java.awt.Rectangle[] rightUpdateAreas);

drawStereoscopic API 的扩展形式 drawStereoscopicImages 处理要同时复制的图像数组。

public void drawStereoscopicImages(
   java.awt.Image[] leftImages, 
   int[] leftXs, int[] leftYs,
         java.awt.Rectangle[] leftUpdateAreas,
         java.awt.Image[] rightImages, 
         int[] rightXs,
         int[] rightYs, 
         java.awt.Rectangle[] rightUpdateAreas); 

对于每个图像,图像与座标之间存在一对一映射。指定了更新区域后,该 API 将确保只复制更新区域的内容。要复制完整图像,可以使用 NULL 作为更新区域。

请注意,由于这两个 API 都不修改源图像,因此左右图像实例可能是相同的图像对象。

 
偏移量元数据

在 3D 世界中,您将图形层与 3D 电影(视频)层混合在一起,为此您必须解决一个问题:如果将图形层放置在特定深度,而电影内容出现在图形层前面,会发生什么情况?所得到的视觉效果肯定很糟糕,如图 5 所示。

在左图中,一切正常,图形层正好在视频层前面。但在右图中,视频层离您更近,红色区域与图形层发生重叠。

您始终需要确保菜单和字幕呈现在视频的前面。

偏移量元数据

图 5:偏移量元数据

蓝光播放器可根据偏移量元数据序列自动调整图形层的位置,偏移量元数据通常是在创作电影的过程中创建的。此偏移量元数据指示图形层在电影的每个时间位置的平移。此信息允许您在电影的 3D 场景改变深度时动态调整图形平面的深度位置。一个音频视频 (A/V) 流可能有不止一个偏移量序列,这是为了适应观看者不同的喜好;还可以有无偏移量元数据的字幕。

利用偏移量元数据的 Java API,您可以选择一个偏移量序列或查询当前所选择的序列号。

GraphicsOffsetSequenceControl 是一个 Java 媒体框架 (JMF) 控件,用于获取或设置 JMF 播放器的偏移量序列的序列 ID。它提供一种更改监听器机制,当偏移量序列 ID 发生更改时,可以得到通知。

在每一帧,偏移量的值都可能发生变化。此 API 只处理偏移量序列,不处理单个的偏移量值。通过编程方式无法确定实际的偏移量平移,因为图形层的实际平移发生在播放器引擎内部,未涉及到应用程序。偏移量元数据可以用于“单平面 + 偏移量”模式和双平面模式。

 
其他 3D API

3D BD-J 扩展另外还提供了几个小 API 以执行以下操作:

  • 选择字幕的对齐方式(顶对齐、底对齐)

  • 查询显示器的 3D 功能

  • 查询显示器的 3D 功能

总结

读完本文后,您已对 BD-J 的 3D 概念大致有了个印象。如果您现在急于着手进行自己的开发,则需要建立 BD-J 的开发环境,获取几个免费工具,还要准备一个软件播放器。

您可以在硬盘上创建应用程序和蓝光光盘映像,然后将其作为虚拟磁盘安装到软件蓝光播放器上。有几个软件播放器可以呈现立体图像,也就是在普通显示器上显示 3D 信息的红色和蓝色编码。这是一种折衷方法,不过这种方法是最便宜的,无需购买快门式立体眼镜和支持 3D 的显示器即可提供 3D 感觉。我在不借助任何其他硬件的情况下,已经成功地在最新的笔记本电脑上完成了一些演示应用程序。

BD-J 3D API 文档

鉴于 BD-J 平台中组合了来自不同标准的一些部分,因此不可能从单一来源获取平台所需的全套 JavaDoc。BD-J 系统不同层的文档可以分别从以下来源获取:

另请参见

下面是其他一些资源:

  • 另请参见《Programming HD-DVD and Blu-ray Disc: The HD Cookbook》一书的网站: http://hdcookbook.com
  •  

关于作者

Michael Lagally Michael Lagally 是 Oracle 技术人员中的主要成员。他任职于技术管理组,在电视相关的和其他标准化组织中代表 Oracle,例如 DVB、Blu-ray Disc Association 以及 Java Community Process (JCP)。

 

Michael Lagally