BlackBerry 平台支持 MMAPI,支持 Player在 BlackBerry界面框架上播放视频。视频格式包括 mpg, 3gp, avi 等等。以下代码片段分别解释在 MIDP和 BlackBerry UI两种框架下的视频播放。
对于提供了 LCDUI支持的 MIDP实现:
public void playVideo() {
try {
// 创建 Player ,媒体资源为网络上的视频,并获取视频信息
Player p = Manager.createPlayer ( "http://abc.mpg" );
p.realize();
// 界面控制器
GUIControl gc;
// 获取界面控制器
// 使用 Item 播放视频
// 把 Item 添加到 Form ,再显示 Form
// 实现了在 Form 播放视频
if ((gc = (GUIControl) p.getControl( "GUIControl" )) != null ) {
Form form = new Form( "My GUI" );
form.append((Item) gc.initDisplayMode(
GUIControl. USE_GUI_PRIMITIVE , null ));
Display.getDisplay ( this ).setCurrent(form);
}
// 开始播放
p.start();
} catch (MediaException pe) {
} catch (IOException ioe) {
}
}
在 MIDP框架下界面方式有两种, Form和 Canvas。 Form界面是 MIDP框架下的高级 UI组件,容器与组件的结构。上述代码是在 MIDP高级 UI框架中播放视频。 Canvas是 MIDP框架中的低级界面,程序员需要在 Canvas上绘制自己的 UI组件。 Canvas上播放视频范例如下:
MIDP框架下 Canvas组件上播放视频 :
public void playVideo(Canvas canvas) {
try {
// 创建 Player ,媒体资源为网络上的视频,并获取视频信息
Player p = Manager.createPlayer ( "http://abc.mpg" );
p.realize();
// 视频控制器
VideoControl vidc;
// 获取视频控制器
// 传入 Canvas ,配置在 Canvas 里播放视频
// 使用视频控制配置播放参数
if ((vidc = (VideoControl) p.getControl( "VideoControl" )) !=
null ){
vidc.initDisplayMode(VideoControl. USE_DIRECT_VIDEO ,
canvas);
vidc.setDisplayFullScreen( true );
vidc.setVisible( true );
}
// 开始播放
p.start();
} catch (MediaException pe) {
} catch (IOException ioe) {
}
}
在使用 Canvas播放视频时,需要获取 VideoControl,它可以把 Canvas作为播放组件,同时提供一些方法调整视频显示位置和尺寸。
以上是 MIDP框架下高级 UI和低级 UI播放视频的方法。在 BlackBerry平台上如果应用程序使用的是 MIDP框架开发视频播放,可以直接使用这两个范例。 BlackBerry平台提供 BlackBerry特有的 UI框架,框架结构与 J2SE比较类似, Container-LayoutManager-Component的结构。 BlackBerry最基本的 UI组件是 Field,视频需要在 Field里进行播放,范例 如下:
BlackBerry UI框架下播放视频 :
public void playVideo(){
try {
// 创建新播放器
InputStream is = this .getClass().getResourceAsStream( URI );
m_player = javax.microedition.media.Manager.createPlayer (is,
VIDEO_FORMAT );
// 获取视频文件信息,这一步一定要有,否则获取的 VideoControl 将无效
m_player .realize();
// 获取视频控制
m_videoControl =
(VideoControl) m_player .getControl( "VideoControl" );
if ( m_videoControl != null )
{
// 从视频控制获取 UI 组件,这个组件用来显示视频,常用组件比如 Field
m_videoField = (Field) m_videoControl .initDisplayMode
(VideoControl. USE_GUI_PRIMITIVE ,
"net.rim.device.api.ui.Field" );
// 设置显示尺寸
m_videoControl .setDisplayFullScreen( true );
// 使视频可见
m_videoControl .setVisible( true );
}
if ( m_videoField != null ){
// 添加视频组件到屏幕并开始播放
add( m_videoField );
m_player .start();
}
} catch (Exception ex){
ex.printStackTrace();
}
}
创建播放器和播放流程与 MIDP框架下的播放器相同,但在获取显示视频组件时有所不同,对于 BlackBerry风格的界面要求在 Field里显示视频:
Field videoField = (Field)
m_videoControl .initDisplayMode(VideoControl. USE_GUI_PRIMITIVE ,
"net.rim.device.api.ui.Field" );
要注意的是获取 VideoControl之前一定要让播放器获取媒体信息, Player.realize(),否则获取的 VideoControl无效。
以上是在三种界面框架下的播放方式。针对 BlackBerry平台 BlackBerry风格界面的视频播放,以下是一个完整的代码例子:
import java.io.InputStream;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
public class VideoPlayerApp extends UiApplication{
private static VideoPlayerApp m_instance;
private VideoScreen m_videoPlayerScreen;
public static void main(String[] args){
// 应用程序启动入口
getInstance().enterEventDispatcher();
}
public VideoPlayerApp(){
// 创建播放器屏幕
m_videoPlayerScreen = new VideoScreen();
// 推出屏幕堆栈,显示播放器屏幕
pushScreen(m_videoPlayerScreen);
}
// 实现 VideoPlayerApp单类,运行环境中只有一个VideoPlayerApp实例
public static synchronized VideoPlayerApp getInstance(){
if (m_instance == null){
m_instance = new VideoPlayerApp();
}
return m_instance;
}
// 播放器屏幕
class VideoScreen extends MainScreen{
// 指向本地视频的URI
public static final String URI = "/video/song.3GP";;
// 视频格式,video/3gpp支持3gp文件
public static final String VIDEO_FORMAT = "video/3gpp";
// 播放器实例
private Player m_player;
// 视频播放控制
private VideoControl m_videoControl;
private Field m_videoField;
public VideoScreen(){
super(Manager.NO_HORIZONTAL_SCROLL|Manager.NO_VERTICAL_SCROLL);
// 在VideoScreen上播放视频
playVideo();
}
// 创建播放器
private void playVideo(){
try{
// 创建新播放器
InputStream is = this.getClass().getResourceAsStream(URI);
m_player = javax.microedition.media.Manager.createPlayer(is, VIDEO_FORMAT);
// 获取视频文件信息,这一步一定要有,否则获取的VideoControl将无效
m_player.realize();
// 获取视频控制
m_videoControl = (VideoControl)m_player.getControl("VideoControl");
if (m_videoControl != null)
{
// 从视频控制获取UI组件,这个组件用来显示视频,常用组件比如Field
m_videoField = (Field) m_videoControl.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE,
"net.rim.device.api.ui.Field");
// 设置显示尺寸
m_videoControl.setDisplayFullScreen(true);
// 使视频可见
m_videoControl.setVisible(true);
}
if (m_videoField != null){
// 添加视频组件到屏幕并开始播放
add(m_videoField);
m_player.start();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
// 阻止屏幕弹出 save菜单
public boolean onSavePrompt(){
return true;
}
}
}