一起学习
1.MPEG-J简介
MPEG-J是MPEG-4 Version 2中对MPEG-4做的扩展,它是一种灵活的编程控制机制。MPEG-J允许在MPEG-4内容中使用Java类。MPEG-J代表了一个视听会话,当这个会话在接收终端表现时,可以适应终端的操作特点。例如,在资源有限和资源可变的情况下可以避免服务质量剧烈变化;另外,MPEG-J具有响应用户交互的能力,允许对接收终端进行程序控制,这极大地方便了诸如机顶盒、交互游戏和移动AV终端等应用的集成。这些特点使对本地和远程终端的高层交互控制成为可能。Java代码能够创建和修改场景,完全参与场景交互,控制解码器。Java代码也可以产生GUI组件,直接实现应用功能。但是,为了确保高质量解码,Java代码不能参与实时媒体的数据流,例如,实现一个视频解码器等。
2.MPEG-J系统结构
MPEG-J是一套程序控制系统,它定义了MPEG-4媒体播放器和Java代码之间的互操作接口。通过把MPEG-4媒体和安全的可执行代码结合起来,内容创建者能够在媒体数据中嵌入复杂的控制机制,实现对视听会话的智能管理。Java代码是以独立的基本码流传送到MPEG-4终端的。在接受端MPEG-J代码将直接到达MPEG-J运行时间环境,MPEG-J程序可以访问MPEG-4播放器的各种组件。MPEG-J软件体系结构如下图:
图1中的体系结构考虑到了底层平台上的可用资源。这个结构包括了独立组件的隔离、接口设计以及组件之间互操作的特性。这些组件包括:
解码和显示资源:我们认为解码和显示资源是有限的。这个组件对播放器中这些动态和静态资源的访问进行了抽象。
解码器:这个组件抽象了用于解码接收媒体流的媒体解码器,以及对解码器的编程控制和操纵。
网络资源:这个组件抽象了对媒体码流的控制,也抽象了传输和显示码流的管道。
场景图:每个MPEG-4会话都有一幅场景图,场景图在时间和空间上代表了视听对象。这个组件抽象了对场景图的访问和控制。
MPEG-J系统中定义的MPEG-J应用程序接口(MPEG-J API)就是反映上述组件的接口。图2表示了一个控制MPEG-4解码的MPEG-J播放器。图2中的下半部分是MPEG-4解码器模型,相当于图1中的显示引擎(Presentation Engine)部分。图2中的上半部分表示了MPEG-J系统对显示引擎的控制,相当于图1中的应用引擎部分(Application Engine)。
3. MPEG-J会话
只有当接收到并且将要执行MPEG-J应用程序的时候才需要启动MPEG-J会话,这可以通过一个或多个MPEG-J基本码流来识别。
3.1 MPEG-J会话的启动
当MPEG-4播放器接收到一个MPEG-J对象描述符的时候就初始化MPEG-J会话。播放器要执行如下步骤:
播放器通过DMIF通道打开MPEG-J基本码流。MPEG-J基本码流与其他MPEG-4码流相似,都是经过同步层打包的码流。
播放器把访问单元(Access Units)投递给类载入器,由后者载入类。
MPEG-J码流中的一个入口点(run方法)可以不只有一个类。每次接收到一个包含入口点的类,在该处都要启动一个执行线程。
使用MPEG-J应用程序接口控制MPEG-4播放器的MPEG-J应用程序既可以在本地也可以在远端。在远程应用的情况下,远端的应用程序在MPEG-J基本码流中接收,它必须实现MPEGlet接口——MPEGlet是通过码流传送到客户端的Java MPEG-J应用程序。本文下面部分讲述的MPEGlet的生命周期和安全模型不适用于本地的应用程序。
3.2 MPEG-J基本码流和名字空间
3.2.1 MPEG-J基本码流
MPEG-J数据由类文件和对象数据组成,通过媒体流以MPEG-J基本码流的形式传送到MPEG-J终端。在一个MPEG-J码流中的类文件和所有相关的数据可以随意地打包在一起。
3.2.2 MPEG-J码流的名字空间
MPEGlet的名字空间从MPEG-J基本码流的对象描述符中继承而来。与场景图中的节点标识相类似,在一个基本码流中的MPEGlet所使用的所有标识符都在这个基本码流及其对象描述符的名字空间中解释。因而,所有限制内联场景的名字空间的规则对MPEG-J会话同样起作用。
3.2.3 MPEGlet的生命周期
MPEGlet的生命周期与applet非常相似。MPEGlet接口拥有init()、run()、stop()和destory()方法。当接收到MPEGlet的时候,会在Strat-Loading时间戳之后和Load-By时间戳之前的时间段内加载MPEGlet。在由Load-By时间戳确定的时刻,执行MPEGlet的init()方法。初始化MPEGlet之后,run()方法作为一个独立的线程被调用。与applet类似,在MPEGlet接口中要定义stop()和destory()方法。如果MPEG-J播放器在码流中接收到另外一个MPEGlet,新接收到的MPEGlet要作为一个不同的线程来初始化和启动。
3.2.4 MPEGlet的安全模型
MPEGlet的安全模型与applet的安全模型极为相近。但是,在播放器上执行的安全管理器能够添加和减少安全限制。缺省情况下,所有应用于applet的安全限制也可以应用于MPEGlet。MPEGlet的这些缺省的安全限制如下:
· MPEGlet不能加载联接库或者定义自然方法。
· MPEGlet只能使用由底层平台提供的它自己的Java代码、MPEG-J APIs以及Java APIs。
· 通常MPEGlet不能读写运行这个MPEGlet的主机的文件。
· MPEGlet不能在其运行的主机上启动任何进程。
· 除了通过终端能力接口,MPEGlet不能读取系统属性。
4. MPEG-J数据的传输
MPEG-J应用程序是以MPEG-4基本码流的形式传送到MPEG-4播放器的。MPEG-J数据可以是类、序列化的对象,或者其他任何相关数据。序列化的对象和其他辅助数据要与能够处理这些数据的类在一起。
MPEG-J数据(类或者对象)必须要实时的传送给播放器。为了保证这一点可以使用Java码流头标识。在每个文件或对象数据传递到同步层之前都要携带这种头标。经过同步层打包之后,可以使用任何实时传输机制,如FlexMux、RTP甚至是MPEG-2传输码流来传输这些数据。
4.1 丢包
传输过程中的丢包问题会给Java程序的执行造成麻烦。解决这一问题的可以采用如下方法:
在没有上行通道的情况下,以固定的时间间隔重传整个类。这有助于实现随机访问。然而,如果客户数量很多或者类很大的话,这种方法是不可取的,应该禁止重传。
如果有上行通道,可以通知服务器重传已经丢失的包。有一些错误恢复方案可以恢复部分丢失的数据,例如前向纠错方案。
MPEG-J播放器并不处理丢包问题,它认为传输层是足够可靠的,确保不会丢包。
4.2 类依赖
如果一个类依赖于其他类,那么必须在加载这个类之前加载它所依赖的类。这就像在实例化一个对象之前,必须下加载这个对象的类一样。做到这一点的方法之一是使用封装机制,如JAR,把所有相关的类文件封装在一起。但是,这种方案并不好,特别是在传输通道不可靠的情况下,仅仅一个信息包丢失就会导致整个包丢失。在Java码流头标中提供了一种简单的类依赖机制。某个类依赖的所有类都列在这个类文件的头标中。在加载这个类之前需要先加载所有它依赖的类。
4.3 MPEG-J中的时间戳
在同步层的SL头标中定义的解码时间戳(DTS)和合成时间戳(CTS)也用于适时的传递MPEG-J基本码流。除此之外,MPEG-J码流中还有两个十分重要的时间戳:
Start-Loading时间戳:这个时间戳指示了启动加载一个类的过程的时间。这个时间戳对于避免名字空间冲突和资源冲突是十分必要的,它也保证了需要载入类的资源载终端是可用的。
Load-By时间戳:这个时间戳指示了在MPEG-J终端应该加载一个类的时间。如果这个类实现了MPEGlet接口,在同一时刻也要初始化这个类(通过运行init()方法)。初始化之后,MPEGlet作为一个独立的线程运行(执行run()方法)。
Start-Loading时间戳和Load-By时间戳定义了一个加载类的时间窗口。这个时间窗口有助于解决类之间依赖关系。如果这两个时间戳之间的时间窗口变得足够大,就可以避免由于在不同客户终端上加载时间不一致的问题。另外,如果传输通道不可靠,也可以增大这个窗口保证重传。在这种机制下,类加载的顺序可以与类到达的顺序不同。
4.4 MPEG-J码流标志头
4.4.1 JavaStreamHrader
4.4.1.1 语法
ligned(32) class JavaStreamHeader{
bit(2) version;
bit(1) isClassFlag;
bit(13) numReqClasses;
bit(1) isPackaged;
bit(3) compressionScheme;
bit(12) reserved;
JavaClassID classID;
JavaClassID reqClassID[numReqClasses];
}
|
4.4.1.2 语义
version:版本号,目前的值为00。 IsClassFlag:把该值设为1,表示码流的有效负载是一个类;把该值设为0表示码流的有效负载不是类,而是可访问的MPEGle的内容这些内容可能是java对象或者其他数据。
numReqClasses:加载这个类之前需要的类的数目。
isPackaged:该值为0,表示是单一类文件,不是包。该值为1,表示是由多个类文件组成的包。
compressionScheme:确定码流压缩使用的方案(000表示没有压缩;001表示使用ZIP压缩,010——111由ISO保留)。
reserved:ISO为将来使用而保留。目前应为0xFF。
classID:类或包的识别信息。JavaClassID的类型定义如4.4.2所示。
reqClassID[n]:n个必需类的识别信息。
4.4.2 JavaClassID
4.4.2.1 语法
aligned(32) class JavaClassID{
bit(16) length;
bit(8*length) ID;
}
4.4.2.2 语义
length:ID的字节数。
ID:标识类的可变长字符串。这个字符串要填充,使得ID长度域和ID域的总的长度是32比特的倍数。
5.MPEG-J 应用程序接口(MPEG-J API)
程序包是实现应用程序接口的一种组织方式。MPEG-J API分成以下五类程序包:
org.iso.mpeg.mpegj.mpegj
org.iso.mpeg.mpegj.scene
org.iso.mpeg.mpegj.resource
org.iso.mpeg.mpegj.network
org.iso.mpeg.mpegj.decoder
5.1 MPEG-J(org.iso.mpeg.mpegj)
MPEG-J终端类(MPEG-J Terminal)提供了在接收终端运行的各种管理器的信息。每个MPEGlet或者应用程序一旦被加载的时候都要实例化一个新的MPEGjTerminal。这个类含有访问所有管理器的方法。管理器包括:场景观管理器(SceneManager)、资源管理器(ResourceManager)和网络管理器(NetworkManager)。
ObjectDescriptor,ESDDescriptor和DecoderConfigDescriptor接口也是org.iso.mpeg.mpegj.mpegj程序包的一部分。这些接口提供了对相应描述符的访问,通过这些接口可以获取关于节点、基本码流及其类型的信息和解码器的信息。
5.2 Scene API
SceneGraph API提供了一种机制,通过这种机制MPEG-J应用程序可以访问和操纵BIFS场景。这是一种低级接口,它允许MPEG-J应用程序监视场景中的事件,可以按照预定的方式修改场景树。MPEG-J应用程序也可以创建和操纵节点,但是MPEG-J应用程序只能访问由DEF示例的节点的域。
这个接口是MPEG-J场景图管理器的最低层。接收终端只需要实现这个包就可以使MPEG-J绑定于初始场景其他类库可以完全用java定义,在更高的层次上访问和控制场景。
5.3 Resource API
程序的执行要与终端的配置和终端的执行能力相一致。MPEG-J程序需要了解其运行环境,以便于调整它自己的运行和在MPEG-4终端上配置和运行的各种组件的执行。这个接口在org.iso.mpeg.mpegj.resource程序包中定义,用于监视系统资源、使用事件机制监听例外并且处理这些不可测的事件。资源包有助于MPEG-4会话调整自身来适应各种终端资源。这个包的主要组成部件是资源管理器、事件模型、用来监视终端动态和静态能力的能力管理器,以及终端部件管理器。
5.4 Decoder API
Decoder API实现了对一个MPEG会话中所有已经安装了的解码器的基本控制。可以通过资源管理器接口访问与特定节点相关的解码器。MPDecoder是抽象了绝大多数普通解码器的一种接口。
MPDecoder应用程序接口是解码器启动、停滞、暂停和继续。它也实现了把码流和一个解码器关联以及取消这种关联。它也可以获取当前相关联码流的描述符。
5.5 Net API
网络接口目的在于控制MPEG-4播放器的网络组件。通过这些接口,java应用程序能够与网络实体进行交互。由于MPEG-J 网络接口所提供的抽象级别,应用程序网络情况的具体细节。
为了避免结构不一致和工具重复,MPEG-J 网络接口不允许完全,任意地使用DMIF和同步层。目前网络接口的功能主要可以分为两部分:
网络访问:为了获取MPEG-4播放器使用的DMIF资源的统计信息,执行对网络模块的访问。这个能力是很重要的特征。
通道控制: 一种简单的通道控制机制。使用这个机制MPEG-J应用程序能够暂时打开或关闭现存的基本码流通道,而不会对播放器的其他部件产生任何负面影响。这一特性使得MPEG-J有能力在资源有限或者资源情况随时间变化的情况下,实现缓慢衰减,避免服务质量剧烈变化。
MPEG-J标准中定义了几百个应用程序接口,本文就不加以详细描述了。具体细节可以查阅参考文献[1]。
6.总结
MPEG-4的其他组件是由参数控制的,而MPEG-J是由程序控制的。MPEG-J为MPEG-4播放器Java程序代码的互操作定义了一系列编程接口。这就为在MPEG-4播放器中执行Java程序提供了可能。把MPEG代码和Java结合起来,可以为MPEG-4添加更丰富的内容。MPEG-J一定会成为实现交互技术的主要手段,而且会渗透到信息家电、机顶盒、3G移动通讯中去。
下载本文示例代码
MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述MPEG-J综述
阅读(179) | 评论(0) | 转发(0) |