⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplevideodemo.java

📁 基于J2ME的手机视频播放系统的开发,可以播放本地视频和网络视频,是我从一编程杂志上找到的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*****************************************
 * 软件名:手机视频播放器                **
 * 功能:实现本地视频和网络视频的播放   **
 * 程序名: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 + -