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

📄 simplevideodemo.java

📁 基于J2ME的手机视频播放系统的开发,可以播放本地视频和网络视频,是我从一编程杂志上找到的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				if (player.getState() == Player.REALIZED
						|| player.getState() == Player.UNREALIZED) {
					player.close();			// 关闭player对象
				}
			}
			player = null;
		}
		void reset() {
			player = null;
		}
		void stopPlayer() {
			try {
				defplayer();
			} catch (MediaException err13) {
				System.err.println("err13");
			}
			reset();
		}		
		// player监听事件处理方法
		/*因为视频播放往往对机器的资源要求很高,同时无线网络的带宽往往很小,所以应该改
		 *进视频播放的程序,只有视频播放的Player对象准备就绪后,才运行开始播放视频,
		 *不应该让视频播放程序占用太多的资源,因此应该增加对Player对象的各种状态的判断。
		 */
		/*首先增加一个Player播放对象的监听器PlayerListener,并实现PlayerListener监听器
		 *的处理方法playerUpdate(),在playerUpdate()方法中判断视频播放是否结束了,可以
		 *使用参数event获得视频正在播放的各种状态。
		 */
		public void playerUpdate(Player player, String event, Object data) {
			if (event == PlayerListener.END_OF_MEDIA) { //判断是否播放结束
				try {
					defplayer();	// 释放资源
					areaurl.setString("z");
					System.out.println("影视已播放完毕,欢迎再次点播!");
					display.setCurrent(anAlert, form);
				} catch (MediaException err8) {
					System.out.print("err8");
				}
				reset();
			}
		}
		public void start() {
			t = new Thread(this);
			System.out.println("启动线程,防止网络阻塞!");
			t.start();
		}
		
		// 为了防止阻塞,使用线程
		public void run() {
			if (((areaurl.getString()).substring(0,1)).equals("`")) {
				System.out.println("正打开本地视频");
				// canvasvideo.areaplay(areaurl.getString());
				areaplay(areaurl.getString());
			}
			else {
				System.out.println("正打开网络视频");
				netplay(url.getString());
			}
		}
		
		// 本地视频播方法
		void areaplay(String url) {
			try {
				// 在创建新对象之前先释放资源
				defplayer();
				InputStream ins = getClass().getResourceAsStream("/"+url);
				player = Manager.createPlayer(ins, "video/mpeg");
				player.addPlayerListener(this);
				player.realize();	// 准备播放
				vc2 = (VideoControl) player.getControl("VideoControl");
				if (vc2 != null) {
					vc2.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
					// 获取视频的原始大小
					int frameW = vc2.getSourceWidth();
					int frameH = vc2.getSourceHeight();
					// 计算视频屏幕在手机屏幕上的坐标
					if (frameW > videoW)
						frameW = videoW;
					if (frameH > videoH)
						frameH = videoH;
					int frameX = (videoW - frameW) / 2 + VB_W;
					int frameY = (videoH - frameH) / 2 + VB_H;
					// 设置视频屏幕坐标,使视频在手机屏幕的中间显示
					vc2.setDisplayLocation(frameX, frameY);
					// 设置视频屏幕大小
					vc2.setDisplaySize(frameW, frameH);
					vc2.setVisible(true);
					this.addCommand(AStopCmd);
					this.addCommand(AExitCmd);
					this.setCommandListener(this);
				}
				player.prefetch();	// 使player对象进入PREFETCH状态
				// 获取视频时长,用于在视频播放时显示
				try {
					duration = player.getDuration();
				} catch (Exception err9) {
					System.err.println("err9");
					reset();
				}
				player.start();		// 播放视频
			} catch (Exception err10) {
				display.setCurrent(areaform);
				areaform.append("打开视频时可能出错..请重试!");
				reset();
			}		
		}
		// 网络视频播放方法
		void netplay(String url) {
			try {				
				// 在创建新对象之前先释放资源
				defplayer();			
				player = Manager.createPlayer(url);
				player.addPlayerListener(this);
				player.realize();	// 准备播放
				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("影片时长:", time2String(duration)+"秒");
					v.append(si2);
				} catch (Exception err11) {
					System.err.println("err11");
					reset();
				}
				player.start(); // 播放视频
			} catch (Throwable err11) {
				urlform.append("连接超时或服务器地址不正确");
				reset();
			}
		}		
		// 将long型的视频时间转换为字符串格式
		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;
		}		
		
		/*为了防止网络阻塞造成的死机假象,需要使用线程来控制程序的播放。
		 *但是线程的控制是由手机的操作系统来控制的,线程可能会有暂停的
		 *可能,而线程恢复以后则会调用程序的startApp方法,因此需要在
		 *startApp方法中调用状态判断方法,用来判断是否继续播放还是释放资源。
		 */
	 	// 开始播放
		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类的事件处理方法
		public void commandAction(Command c, Displayable d) {
			// 如果在播放本地视频时按了"暂停"按钮
			if (c == AStopCmd) {
				try {
					pauseApp();
					repaint(0, 0, canvasW/2, VB_H);	// 重画屏幕上部的状态信息
					System.out.println("本地视频暂停");
					this.removeCommand(AStopCmd);
					this.addCommand(APlayCmd);
				} catch (Exception err6) {
					System.err.println("err6");
				}
			}
			// 如果在暂停本地视频时按了"播放"按钮
			if (c == APlayCmd) {
				try {
					player.start();
					repaint(0, 0, canvasW/2, VB_H);	// 重画屏幕上部的状态信息
					System.out.println("继续播放");
					this.removeCommand(APlayCmd);
					this.addCommand(AStopCmd);
				} catch (Exception err7) {
					System.err.println("err7");
				}
			}
			// 如果在播放本地视频时按了"退出"按钮
			if (c == AExitCmd) {
				areaurl.setString("z");
				System.out.println("本地视频已关闭,您可继续选择其他视频");	
				player.close();		// 关闭并删除player对象
				System.gc();
				display.setCurrent(anAlert, vlist);
			}
			// 如果在播放网络视频时按了"退出"按钮
			if (c == VExitCmd) {		
				System.out.println("网络视频已关闭,您可输入其他网络视频地址");
				player.close();		// 关闭并删除player对象
				System.gc();
				display.setCurrent(anAlert, urlform);
			}
			// 如果在播放网络视频时按了"暂停"按钮
			if (c == VStopCmd) {
				try {
					pauseApp();
					System.out.println("网络视频暂停");
					v.removeCommand(VStopCmd);
					v.addCommand(VPlayCmd);
				} catch(Exception ds) {
					System.err.println("ds");
				}
			}
			// 如果在暂停网络视频时按了"播放"按钮
			if (c == VPlayCmd) {
				try {
					player.start();
					System.out.println("继续播放");
					v.removeCommand(VPlayCmd);
					v.addCommand(VStopCmd);
				} catch (Exception err5) {
					System.err.println("err5");
				}
			}
		}				
		
		// 手机键盘事件处理方法(只对使用Canvas类的本地视频有效)
		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 {
						/* 对网络视频播放无效
						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 {
						/* 对网络视频播放无效
						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("黑屏状态,按9键返回");
					vc2.setVisible(false);
					// vc.setVisible(false);
					break;
				case Canvas.KEY_NUM9:
					System.out.println("视频显示状态为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对象,用于控制音量
				VolumeControl volume = (VolumeControl) player.getControl("VolumeControl");
				if (volume != null) {
					// 目前音量级别
					volumesetting = volume.getLevel();
					// 如果不是消音
					if (mute != true) {
						// 调整音量
						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("取消静音");
						}
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -