?? simplevideodemo.java
字號:
/*****************************************
* 軟件名:手機視頻播放器 **
* 功能:實現本地視頻和網絡視頻的播放 **
* 程序名:SimpleVideoDemo.java **
* 版本:Ver1.0 **
* 作者:鄭云斌、張靈浩、龍深圳 **
* 指導老師:仵博、池瑞楠 **
* 日期:2006年12月 **
* 開發環境:J2ME Wireless Toolkit 2.2 **
****************************************/
package video.SimpleVideoDemo;
import java.io.*;
import java.util.*;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
public class SimpleVideoDemo extends MIDlet implements CommandListener, ItemCommandListener {
private Display display;
private Player player;
private VideoControl vc, vc2;
private List vlist;
private Alert anAlert;
private TextField url, areaurl;
private Form form, urlform, v, areaform;
private long duration; // 影片持續時間
private static CanvasVideo canvasvideo = null;
// 命令按鈕
private Command ExitCmd = new Command("退出程序", Command.EXIT, 1);
private Command NetCmd = new Command("網絡視頻", Command.SCREEN, 1);
private Command ABackCmd = new Command("返回", Command.BACK, 1);
private Command ASureCmd = new Command("確認", Command.SCREEN, 1);
private Command AStopCmd = new Command("暫停", Command.STOP, 1);
private Command APlayCmd = new Command("播放", Command.SCREEN, 1);
private Command AExitCmd = new Command("退出", Command.EXIT, 1);
private Command AreaCmd = new Command("本地視頻", Command.SCREEN, 1);
private Command VStopCmd = new Command("暫停", Command.STOP, 1);
private Command VPlayCmd = new Command("播放", Command.SCREEN, 1);
private Command VExitCmd = new Command("退出", Command.EXIT, 1);
private Command UBackCmd = new Command("返回", Command.BACK, 1);
private Command LBackCmd = new Command("返回", Command.BACK, 1);
private Command ConnectCmd = new Command("連接服務器", Command.BACK, 1);
public SimpleVideoDemo() {
display = Display.getDisplay(this);
canvasvideo = new CanvasVideo(display);
// 主菜單界面form
form = new Form("視頻播放系統");
StringItem item;
item = new StringItem("視 頻 服 務 一:", " 網 絡 視 頻 ", Item.HYPERLINK);
item.setDefaultCommand(NetCmd);
form.append(item);
item.setItemCommandListener(this); // 為item注冊監聽器
item = new StringItem("視 頻 服 務 二:", " 本 地 媒 體 ", Item.HYPERLINK);
item.setDefaultCommand(AreaCmd);
form.append(item);
item.setItemCommandListener(this); // 為item注冊監聽器
form.addCommand(ExitCmd);
// 本地視頻列表的界面
Image img;
try {
img = Image.createImage("/alert.png");
} catch (java.io.IOException err14) {
img = null;
}
Image[] liArray = null;
try {
Image licon = Image.createImage("/symbol.png");
liArray = new Image[] {licon, licon, licon, licon, licon, licon};
} catch (java.io.IOException err1) {
System.out.print("load failed....");
liArray = null;
}
String[] lsArray = {"最終幻想", "六月的雨", "第一次", "仙劍主題歌", "天仙子",
"爆笑小猴子"};
vlist = new List("請選擇影視節目", Choice.IMPLICIT, lsArray, liArray);
vlist.addCommand(LBackCmd);
// 本地視頻選擇確認界面
areaform = new Form("當前影視");
areaurl = new TextField("影片名:", "b", 20, TextField.ANY);
areaform.addCommand(ABackCmd);
areaform.append(areaurl);
item = new StringItem("請確認", "\n確定播放嗎?", Item.BUTTON);
item.setDefaultCommand(ASureCmd);
areaform.append(item);
item.setItemCommandListener(this); // 為item注冊監聽器
// 網絡視頻網址輸入界面
urlform = new Form("網絡視頻通道...");
url = new TextField("請輸入視頻地址:", "http://127.0.0.1:8080/a.mpg", 100, TextField.URL);
urlform.append(url);
urlform.addCommand(UBackCmd);
urlform.addCommand(ConnectCmd);
// 視頻播放完畢提示
anAlert = new Alert("溫馨提示!", "您點播的影視節目已播放完畢,歡迎再次點播!",
img, AlertType.INFO);
anAlert.setTimeout(2000);
// 網絡視頻播放界面
v = new Form("網絡視頻已啟動...");
// 為各個界面注冊監聽器
form.setCommandListener(this);
vlist.setCommandListener(this);
areaform.setCommandListener(this);
urlform.setCommandListener(this);
}
public void startApp() {
canvasvideo.startApp();
}
public void pauseApp() {
canvasvideo.pauseApp();
}
/*假如關閉了MIDlet程序,則會調用destroyApp()方法,因此需要在destroyApp()
*方法里面添加釋放資源的代碼
*/
protected void destroyApp(boolean unconditional) {
System.out.println("多媒體系統已關閉!");
form = null;
try {
canvasvideo.defplayer();
} catch (MediaException err4) {
System.out.print("err4");
}
}
// Command按鈕的事件處理
public void commandAction(Command c, Displayable d) {
// 如果在主菜單中按了"退出程序"
if (c == ExitCmd) {
destroyApp(false);
notifyDestroyed();
}
// 如果在網絡視頻網址輸入界面按了"連接服務器"
if (c == ConnectCmd) {
System.out.println("試圖連接服務器");
canvasvideo.start();
}
// 如果在網絡視頻網址輸入界面按了"返回"
if (c == UBackCmd) {
System.out.println("多媒體視頻服務主界面");
display.setCurrent(form);
}
// 如果在本地視頻列表界面按了"返回"
if (c == LBackCmd) {
System.out.println("多媒體視頻服務主界面");
display.setCurrent(form);
}
// 如果在本地視頻選擇確認界面按了"返回"
if (c == ABackCmd) {
System.out.println("影視點播界面,請選擇您喜歡的影視...");
display.setCurrent(vlist);
}
// 如果選擇播放本地視頻
if (d.equals(vlist)) {
if (c == List.SELECT_COMMAND) {
// 根據用戶選擇的不同,修改areaurl文本框中的文本信息
switch(((List)d).getSelectedIndex()) {
case 0:
System.out.println("您選擇了《最終幻想》,請確認...否則請返回!");
areaurl.setString("`最終幻想`");
display.setCurrent(areaform);
break;
case 1:
System.out.println("您選擇了《六月的雨》,請確認...否則請返回!");
areaurl.setString("`六月的雨`");
display.setCurrent(areaform);
break;
case 2:
System.out.println("您選擇了《第一次》,請確認...否則請返回!");
areaurl.setString("`第一次`");
display.setCurrent(areaform);
break;
case 3:
System.out.println("您選擇了《仙劍主題歌》,請確認...否則請返回!");
areaurl.setString("`仙劍主題歌`");
display.setCurrent(areaform);
break;
case 4:
System.out.println("您選擇了《天仙子》,請確認...否則請返回!");
areaurl.setString("`天仙子`");
display.setCurrent(areaform);
break;
case 5:
System.out.println("您選擇了《爆笑小猴子》,請確認...否則請返回!");
areaurl.setString("`爆笑小猴子`");
display.setCurrent(areaform);
break;
}
}
}
}
// StringItem控件的事件處理
public void commandAction(Command c, Item item) {
// 如果在主菜單中如果選擇播放網絡視頻
if (c == NetCmd) {
System.out.println("請輸入視頻服務器地址.....");
display.setCurrent(urlform);
}
// 如果在主菜單中如果選擇播放本地視頻
if (c == AreaCmd) {
System.out.println("影視點播界面,請選擇您喜歡的影視...");
display.setCurrent(vlist);
}
// 如果在本地視頻選擇確認界面中按了"確定"
if (c == ASureCmd) {
System.out.println("試圖打開本地視頻");
display.setCurrent(canvasvideo);
canvasvideo.start();
}
}
/*************************************************************************/
// 視頻播放屏幕類(內部類)
class CanvasVideo extends Canvas implements PlayerListener, CommandListener, Runnable {
private Display parentDisplay;
private Thread t;
private static final int VB_W = 2; // Video 邊界寬度
private static final int VB_H = 15; // Video 邊界高度
private boolean vis = true;
private int canvasW; // Canvas寬度
private int canvasH; // Canvas高度
private int videoW; // 視頻屏幕寬度
private int videoH; // 視頻屏幕高度
static final int VOLUME_LEVEL = 50; // 音量初始化為50
private int volumesetting = VOLUME_LEVEL; // 音量級別
private int mCount, mMaximum;
private int mInterval;
private int mWidth, mHeight, mX, mY, mRadius;
public CanvasVideo(Display display) {
this.parentDisplay = display;
canvasW = getWidth(); // 獲取手機屏幕的寬
canvasH = getHeight(); // 獲取手機屏幕的高
videoW = canvasW - 2 * VB_W; // 獲取手機屏幕中可用于視頻顯示的區域的寬
videoH = canvasH - 2 * VB_H - 4;// 獲取手機屏幕中可用于視頻顯示的區域的高
mCount = 0;
mMaximum = 36;
mInterval = 100; // 線程執行的間隔時間
// 計算角度
int halfWidth = (canvasW - mRadius) / 2;
int halfHeight = (canvasH - mRadius) / 2;
mRadius = Math.min(halfWidth, halfHeight);
// 通過匿名類創建了一個定時器對象
TimerTask task = new TimerTask() {
public void run() {
mCount = (mCount + 1) % mMaximum;
repaint(0, 0, canvasW, VB_H+2);
}
};
Timer timer = new Timer();
// 在執行任務前等待0秒,然后每過mInterval毫秒再執行一次
timer.schedule(task, 0, mInterval);
}
// 在手機屏幕上繪圖
public void paint(Graphics g) {
g.setColor(0, 0, 0); // 黑色
g.fillRect(0, 0, canvasW, canvasH); // 繪制與手機屏幕一樣大小的矩形
g.setColor(255, 255, 255); // 白色
g.drawString("影片長度:"+ time2String(duration), canvasW, VB_H,
Graphics.BOTTOM | Graphics.RIGHT);
g.drawLine(0, VB_H+1, canvasW, VB_H+1);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_LARGE));
g.drawString("影片載入中...請稍后!",canvasW/2, canvasH/2+10,
Graphics.TOP | Graphics.HCENTER);
g.setColor(255,0,0); //紅色
// 繪制弧度為90度的的餅圖
g.fillArc(canvasW/2-canvasW/4+10, VB_H+10, canvasW/4*2-20, canvasW/4*2-20, 0, 90);
g.fillArc(canvasW/2-canvasW/4+10, VB_H+10, canvasW/4*2-20, canvasW/4*2-20, 180, 90);
g.setColor(255,255,255); //白色
g.fillArc(canvasW/2-canvasW/4+10, VB_H+10, canvasW/4*2-20, canvasW/4*2-20, 90, 90);
g.fillArc(canvasW/2-canvasW/4+10, VB_H+10, canvasW/4*2-20, canvasW/4*2-20, 270, 90);
g.drawLine(canvasW/2, 0, canvasW/2, VB_H);
int theta = -(mCount * 360 / mMaximum);
// 點擊播放時,如player處于STARTED狀態,則先清除"狀態:暫停..."字符串,
// 然后再繪制"狀態:"字符串
if (player.getState() == player.STARTED) {
g.setColor(0, 0, 0);
g.fillRect(0, 0, canvasW/2, VB_H);
g.setColor(255, 255, 255);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
g.drawString("狀態:", VB_W, VB_H, Graphics.BOTTOM| Graphics.LEFT);
// 清除餅圖與"影片載入中...請稍后!"字符串
g.setColor(0, 0, 0);
g.fillRect(0, VB_H+10, canvasW, canvasH-VB_H+10);
g.setColor(255,255,255);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_LARGE));
// 在手機屏幕的底部繪制字符串
g.drawString("視頻已打開...請欣賞^_^...!", canvasW/2, canvasH-VB_H-4,
Graphics.TOP | Graphics.HCENTER);
// 畫播放視頻時的播放動畫
g.setColor(0, 0, 255);
g.drawArc(canvasW/4, 0, VB_H, VB_H, 0, 360);
g.setColor(0,255,0);
g.fillArc(canvasW/4, 0, VB_H, VB_H, theta+90, 90);
g.setColor(0x00ff0000);
g.fillArc(canvasW/4, 0, VB_H, VB_H, theta+270, 90);
}
// 點擊暫停時,如player處于PREFETCHED狀態,則先清除"狀態:正在播放..."字符串,
// 然后繪制"狀態:暫停..."
if (player.getState() == player.PREFETCHED) {
g.setColor(0, 0, 0);
g.fillRect(0, 0, canvasW/2, VB_H);
g.setColor(255, 255, 255);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
g.drawString("狀態:暫停...", VB_W, VB_H, Graphics.BOTTOM | Graphics.LEFT);
}
if (player.getState() == player.STARTED) {
g.setColor(255, 0, 0);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_LARGE));
// 在可用于視頻顯示的區域中間繪制字符串
g.drawString("黑屏狀態,按9鍵返回", videoW/2, videoH/2+VB_H-4,
Graphics.TOP | Graphics.HCENTER);
}
}
// 釋放資源
/*釋放資源也需要根據當前播放器播放的狀態而采取不同的方法,這是因為網絡數據傳輸的
*過程中也許不能夠一次性地完整讀取所有視頻數據,也許中間有一定的中斷,所以需要判
*斷不同的情況。如果Player處于正在播放狀態STARTED,則表示已經完成播放了視頻一部分
*數據或者全部數據,則可以使用stop()方法停止播放,假如還有新的數據,將會從新的數據
*開始播放。如果已經到達PREFETCHED狀態,但是又不能播放,則表示數據可能是錯誤的或
*者其他硬件已經占用了設備等原因造成的,因此使用deallocate()方法釋放排斥資源以方便其他
*設備的使用。
*/
void defplayer() throws MediaException {
if (player != null) {
if (player.getState() == Player.STARTED) {
player.stop(); // 停止播放
}
if (player.getState() == Player.PREFETCHED) {
player.deallocate(); // 釋放資源
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -