?? simplevideodemo.java
字號(hào):
if (player.getState() == Player.REALIZED
|| player.getState() == Player.UNREALIZED) {
player.close(); // 關(guān)閉player對(duì)象
}
}
player = null;
}
void reset() {
player = null;
}
void stopPlayer() {
try {
defplayer();
} catch (MediaException err13) {
System.err.println("err13");
}
reset();
}
// player監(jiān)聽(tīng)事件處理方法
/*因?yàn)橐曨l播放往往對(duì)機(jī)器的資源要求很高,同時(shí)無(wú)線網(wǎng)絡(luò)的帶寬往往很小,所以應(yīng)該改
*進(jìn)視頻播放的程序,只有視頻播放的Player對(duì)象準(zhǔn)備就緒后,才運(yùn)行開(kāi)始播放視頻,
*不應(yīng)該讓視頻播放程序占用太多的資源,因此應(yīng)該增加對(duì)Player對(duì)象的各種狀態(tài)的判斷。
*/
/*首先增加一個(gè)Player播放對(duì)象的監(jiān)聽(tīng)器PlayerListener,并實(shí)現(xiàn)PlayerListener監(jiān)聽(tīng)器
*的處理方法playerUpdate(),在playerUpdate()方法中判斷視頻播放是否結(jié)束了,可以
*使用參數(shù)event獲得視頻正在播放的各種狀態(tài)。
*/
public void playerUpdate(Player player, String event, Object data) {
if (event == PlayerListener.END_OF_MEDIA) { //判斷是否播放結(jié)束
try {
defplayer(); // 釋放資源
areaurl.setString("z");
System.out.println("影視已播放完畢,歡迎再次點(diǎn)播!");
display.setCurrent(anAlert, form);
} catch (MediaException err8) {
System.out.print("err8");
}
reset();
}
}
public void start() {
t = new Thread(this);
System.out.println("啟動(dòng)線程,防止網(wǎng)絡(luò)阻塞!");
t.start();
}
// 為了防止阻塞,使用線程
public void run() {
if (((areaurl.getString()).substring(0,1)).equals("`")) {
System.out.println("正打開(kāi)本地視頻");
// canvasvideo.areaplay(areaurl.getString());
areaplay(areaurl.getString());
}
else {
System.out.println("正打開(kāi)網(wǎng)絡(luò)視頻");
netplay(url.getString());
}
}
// 本地視頻播方法
void areaplay(String url) {
try {
// 在創(chuàng)建新對(duì)象之前先釋放資源
defplayer();
InputStream ins = getClass().getResourceAsStream("/"+url);
player = Manager.createPlayer(ins, "video/mpeg");
player.addPlayerListener(this);
player.realize(); // 準(zhǔn)備播放
vc2 = (VideoControl) player.getControl("VideoControl");
if (vc2 != null) {
vc2.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
// 獲取視頻的原始大小
int frameW = vc2.getSourceWidth();
int frameH = vc2.getSourceHeight();
// 計(jì)算視頻屏幕在手機(jī)屏幕上的坐標(biāo)
if (frameW > videoW)
frameW = videoW;
if (frameH > videoH)
frameH = videoH;
int frameX = (videoW - frameW) / 2 + VB_W;
int frameY = (videoH - frameH) / 2 + VB_H;
// 設(shè)置視頻屏幕坐標(biāo),使視頻在手機(jī)屏幕的中間顯示
vc2.setDisplayLocation(frameX, frameY);
// 設(shè)置視頻屏幕大小
vc2.setDisplaySize(frameW, frameH);
vc2.setVisible(true);
this.addCommand(AStopCmd);
this.addCommand(AExitCmd);
this.setCommandListener(this);
}
player.prefetch(); // 使player對(duì)象進(jìn)入PREFETCH狀態(tài)
// 獲取視頻時(shí)長(zhǎng),用于在視頻播放時(shí)顯示
try {
duration = player.getDuration();
} catch (Exception err9) {
System.err.println("err9");
reset();
}
player.start(); // 播放視頻
} catch (Exception err10) {
display.setCurrent(areaform);
areaform.append("打開(kāi)視頻時(shí)可能出錯(cuò)..請(qǐng)重試!");
reset();
}
}
// 網(wǎng)絡(luò)視頻播放方法
void netplay(String url) {
try {
// 在創(chuàng)建新對(duì)象之前先釋放資源
defplayer();
player = Manager.createPlayer(url);
player.addPlayerListener(this);
player.realize(); // 準(zhǔn)備播放
vc = (VideoControl) player.getControl("VideoControl");
if (vc != null) {
Item video = (Item) vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null);
v.deleteAll();
v.append(video);
v.addCommand(VStopCmd);
v.addCommand(VExitCmd);
v.setCommandListener(this);
display.setCurrent(v);
}
player.prefetch();
try {
duration = player.getDuration();
StringItem si2 = new StringItem("影片時(shí)長(zhǎng):", time2String(duration)+"秒");
v.append(si2);
} catch (Exception err11) {
System.err.println("err11");
reset();
}
player.start(); // 播放視頻
} catch (Throwable err11) {
urlform.append("連接超時(shí)或服務(wù)器地址不正確");
reset();
}
}
// 將long型的視頻時(shí)間轉(zhuǎn)換為字符串格式
private String time2String(long time) {
time = time / 1000000;
String strTime = "" + (time % 10);
time = time / 10;
strTime = (time % 6) + strTime;
time = time / 6;
strTime = (time % 10) + ":" + strTime;
time = time / 10;
strTime = (time % 6) + strTime;
time = time / 6;
return strTime;
}
/*為了防止網(wǎng)絡(luò)阻塞造成的死機(jī)假象,需要使用線程來(lái)控制程序的播放。
*但是線程的控制是由手機(jī)的操作系統(tǒng)來(lái)控制的,線程可能會(huì)有暫停的
*可能,而線程恢復(fù)以后則會(huì)調(diào)用程序的startApp方法,因此需要在
*startApp方法中調(diào)用狀態(tài)判斷方法,用來(lái)判斷是否繼續(xù)播放還是釋放資源。
*/
// 開(kāi)始播放
public void startApp() {
try {
if (player != null && player.getState() == Player.PREFETCHED) {
player.start();
} else {
defplayer();
display.setCurrent(form);
}
} catch (MediaException err2) {
System.err.println("err2");
reset();
}
}
// 暫停播放
public void pauseApp() {
try {
if (player != null && player.getState() == Player.STARTED) {
player.stop();
} else {
defplayer();
}
} catch (MediaException err3) {
System.err.println("err3");
reset();
}
}
// CanvasVideo類(lèi)的事件處理方法
public void commandAction(Command c, Displayable d) {
// 如果在播放本地視頻時(shí)按了"暫停"按鈕
if (c == AStopCmd) {
try {
pauseApp();
repaint(0, 0, canvasW/2, VB_H); // 重畫(huà)屏幕上部的狀態(tài)信息
System.out.println("本地視頻暫停");
this.removeCommand(AStopCmd);
this.addCommand(APlayCmd);
} catch (Exception err6) {
System.err.println("err6");
}
}
// 如果在暫停本地視頻時(shí)按了"播放"按鈕
if (c == APlayCmd) {
try {
player.start();
repaint(0, 0, canvasW/2, VB_H); // 重畫(huà)屏幕上部的狀態(tài)信息
System.out.println("繼續(xù)播放");
this.removeCommand(APlayCmd);
this.addCommand(AStopCmd);
} catch (Exception err7) {
System.err.println("err7");
}
}
// 如果在播放本地視頻時(shí)按了"退出"按鈕
if (c == AExitCmd) {
areaurl.setString("z");
System.out.println("本地視頻已關(guān)閉,您可繼續(xù)選擇其他視頻");
player.close(); // 關(guān)閉并刪除player對(duì)象
System.gc();
display.setCurrent(anAlert, vlist);
}
// 如果在播放網(wǎng)絡(luò)視頻時(shí)按了"退出"按鈕
if (c == VExitCmd) {
System.out.println("網(wǎng)絡(luò)視頻已關(guān)閉,您可輸入其他網(wǎng)絡(luò)視頻地址");
player.close(); // 關(guān)閉并刪除player對(duì)象
System.gc();
display.setCurrent(anAlert, urlform);
}
// 如果在播放網(wǎng)絡(luò)視頻時(shí)按了"暫停"按鈕
if (c == VStopCmd) {
try {
pauseApp();
System.out.println("網(wǎng)絡(luò)視頻暫停");
v.removeCommand(VStopCmd);
v.addCommand(VPlayCmd);
} catch(Exception ds) {
System.err.println("ds");
}
}
// 如果在暫停網(wǎng)絡(luò)視頻時(shí)按了"播放"按鈕
if (c == VPlayCmd) {
try {
player.start();
System.out.println("繼續(xù)播放");
v.removeCommand(VPlayCmd);
v.addCommand(VStopCmd);
} catch (Exception err5) {
System.err.println("err5");
}
}
}
// 手機(jī)鍵盤(pán)事件處理方法(只對(duì)使用Canvas類(lèi)的本地視頻有效)
public void keyPressed(int keyCode) {
int g = getGameAction(keyCode);
if (g == LEFT) {
System.out.println("音量減5");
adjustvolume(-5, false);
}
if (g == RIGHT) {
System.out.println("音量加5");
adjustvolume(5, false);
}
if (g == FIRE) {
adjustvolume(0, true);
}
switch (keyCode) {
case Canvas.KEY_NUM1:
try {
/* 對(duì)網(wǎng)絡(luò)視頻播放無(wú)效
if (vc != null) {
System.out.println("正常屏幕-全屏");
setFullScreenMode(true);
repaint();
}
*/
if (vc2 != null) {
System.out.println("正常屏幕-全屏");
setFullScreenMode(true);
repaint();
}
} catch (Exception err16) {
System.out.println("err16");
}
break;
case Canvas.KEY_NUM3:
try {
/* 對(duì)網(wǎng)絡(luò)視頻播放無(wú)效
if (vc != null) {
System.out.println("全屏-正常屏幕");
setFullScreenMode(false);
repaint();
}
*/
if (vc2 != null) {
System.out.println("全屏-正常屏幕");
setFullScreenMode(false);
repaint();
}
} catch(Exception err17) {
System.out.println("err17");
}
break;
case Canvas.KEY_NUM7:
System.out.println("黑屏狀態(tài),按9鍵返回");
vc2.setVisible(false);
// vc.setVisible(false);
break;
case Canvas.KEY_NUM9:
System.out.println("視頻顯示狀態(tài)為true");
vc2.setVisible(true);
// vc.setVisible(true);
break;
case Canvas.KEY_NUM0:
System.out.println("重新播放");
try {
defplayer();
start();
} catch(Exception err18) {
System.out.println("err18");
}
}
}
// 音量控制方法
private void adjustvolume(int increment, boolean mute) {
if (player != null) {
// 獲取VolumeControl對(duì)象,用于控制音量
VolumeControl volume = (VolumeControl) player.getControl("VolumeControl");
if (volume != null) {
// 目前音量級(jí)別
volumesetting = volume.getLevel();
// 如果不是消音
if (mute != true) {
// 調(diào)整音量
volumesetting += increment;
volumesetting = volume.setLevel(volumesetting);
System.out.println(volumesetting);
} else {
volume.setMute(!volume.isMuted());
if (volume.isMuted()) {
System.out.println("靜音");
} else {
System.out.println("取消靜音");
}
}
}
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -