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

📄 videocanvas.java

📁 此代码是一个j2me视频播放控制程序
💻 JAVA
字号:
package controlVideo;

import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.io.*;

public class VideoCanvas extends Canvas implements Runnable,CommandListener,PlayerListener {
	private static Player player=null;
	private static boolean isCapturePlayer;
	private int idx=0;
	private boolean fsmode=false;
	private Display parentDisplay;
	private long duration;
	private long lastTime=-1;
	private Thread sliderThread;
	private Command backCommand=new Command("Back",Command.EXIT,1);
	private Command pauseCommand=new Command("Pause",Command.ITEM,10);
	private Command playCommand=new Command("Play",Command.ITEM,10);
	private Command snapCommand=new Command("Snapshot",Command.ITEM,10);
	private VolumeControl vc;
	private RateControl  rc;
	private VideoControl vidc;
	private FramePositioningControl fpc;
	private int CB_Y=0;
	private static final int CB_H=8;
	private static final int  TH_W=6;
	private static final int  VB_W=10;
	private static final int   VB_H=8;
	private boolean vis =true ;
	private int canvasW;
	private int canvasH;
	private int videoW;
	private int videoH;
	private boolean suspended =false ;
	private boolean restartOnResume=false;
	private long restartMediaTime;
	
	
	
	//在框架中添加VideoCanvas类的构造函数
	public VideoCanvas(Display parentDisplay){
		this.idx=0;
		this.parentDisplay=parentDisplay;
		canvasW=getWidth();
		canvasH=getHeight();
		CB_Y=canvasH-CB_H-VB_H-20;
		videoW=canvasW-VB_W*2;
		videoH=CB_Y-VB_H*2;
		initialize();
		
		
	}
	private void initialize(){
		addCommand (backCommand);
		addCommand(snapCommand);
		addCommand(pauseCommand);
		setCommandListener(this);
	}
	
	//计算时间
	public void paint(Graphics g){
		if (fsmode )
			return ;
		g.setColor(0x9090E0);
		g.fillRect(0,0,canvasW,canvasH);
		g.setColor(0x202050);
		g.drawLine(VB_W-1,VB_H-1,videoW+VB_W-1,VB_H-1);
		g.drawLine(VB_W-1,VB_H-1,VB_W-1,videoH+VB_H-1);
		if(sliderThread!=null){
			
		g.drawLine(VB_W-1,CB_Y,videoW+VB_W-1,CB_Y);
		g.drawLine(VB_W-1,CB_Y,VB_W-1,CB_Y+CB_H);
		}
		g.setColor(0xD0D0FF);
		g.drawLine(videoW+VB_W, VB_H,videoW+VB_W,videoH+VB_H);
		g.drawLine(videoW+VB_W,videoH+VB_H,VB_W,videoH+VB_H);
		if (sliderThread!=null){
			g.drawLine(videoW+VB_W,CB_Y+1,videoW+VB_W,CB_Y+CB_H+1);
			g.drawLine(videoW+VB_W,CB_Y+CB_H+1,VB_H,CB_Y+CB_H+1);
		}
		if(sliderThread!=null){
			int p=time2pix(lastTime);
			g.drawLine(VB_W+p,CB_Y+1,VB_W+p,CB_Y+CB_H);
			g.drawLine(VB_W+p,CB_Y+1,VB_W+p+TH_W-1,CB_Y+1);
			g.setColor(0x202050);
			g.drawLine(VB_W+p+1,CB_Y+CB_H,VB_W+p+TH_W,CB_Y+CB_H);
			g.drawLine(VB_W+p+TH_W,CB_Y+CB_H,VB_W+p+TH_W,CB_Y+1);
			g.setColor(0xA0A0FF);
			g.fillRect(VB_W+p+1,CB_Y+2,TH_W-2,CB_H-2);
			g.setColor(0);
			g.drawString("00:00",VB_W,CB_Y+CB_H+4,Graphics.TOP|Graphics.LEFT);
			g.drawString(time2String(lastTime)+"/"+time2String(duration),VB_W+videoW,CB_Y+CB_H+4,Graphics.TOP|Graphics.RIGHT);
			
			
			
		}
		
	}
	private int time2pix(long time){
		int t2p=(int )((time*(videoW-1-TH_W))/duration);
		return t2p;
	}
	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;
		
	}
	//负责创建播放视频的Play对象
	public void open(String url){
		try{
			
			
			
			
			synchronized (this){
				
		if (player==null){
					if (url.startsWith("resource:")){
						InputStream ins=getClass().getResourceAsStream(url.substring(9));
						VideoType vy=new VideoType();
						String ct=vy.guessContentType(url);
						vy=null;
						player=Manager.createPlayer(ins,ct);
						
					}else{
						player=Manager.createPlayer(url);
					}
					    player.addPlayerListener(this);
						isCapturePlayer = url.startsWith("capture");
					}
				}
			
			
			
				player.realize();
				if((vidc=(VideoControl)player.getControl("VideoControl"))!=null){
					vidc.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,this);
					int frameW=vidc.getSourceWidth();
					int frameH=vidc.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;
					vidc.setDisplayLocation(frameX,frameY);
					vidc.setDisplaySize(frameW,frameH);
					vidc.setVisible(true);
					}
				Control[]controls=player.getControls();
				for(int i=0;i<controls.length;i++){
					if(controls[i] instanceof VolumeControl)
						vc=(VolumeControl) controls[i];
					if(controls[i] instanceof RateControl)
						rc=(RateControl) controls[i];
					if(controls[i] instanceof FramePositioningControl)
						fpc=(FramePositioningControl) controls[i];
				}
				player.prefetch();
				if(vidc==null)
					addCommand(pauseCommand);
				
			}catch(Exception e)
			{
				System.err.println(e);
				close();
			}
}
	
	//用于播放的start()函数
	public void start(){
		if (player==null)
			return;
		try{
			duration=player.getDuration();
			player.start();
			if(duration!=Player.TIME_UNKNOWN)	{
				sliderThread=new Thread(this);
				sliderThread.start();
				
			}
		}catch(Exception e){
			System.err.println (e);
			close();
		}
	}
	public void run(){
		while (player!=null){
			try{
				long time=player.getMediaTime();
				if (time2pix(time)!=time2pix(lastTime)){
					lastTime=time;
					repaint(VB_W-2,CB_Y,videoW+2,CB_H+2+20);
					
				}
				do{
					Thread.sleep(250);
					
				}while (player!=null&&suspended);
			}catch (Exception e){
				System.err.println("In run():"+e);
				break;
			}
		}
	}
	
	//暂停播放的pause()函数
	
	public void pause(){
		if(player!=null){
			try{
				player.stop();
			}catch (MediaException me){
				System.err.println(me);
			}
		}
	}
	
	//停止播放的close()函数
	public void close(){
		synchronized (this){
			pause();
			if(player!=null){
				player.close();
				player=null;
			}
		}
	}
	public synchronized  void stopVideoCanvas(){
		player.deallocate();
	}
	
	//
	public void playerUpdate(Player plyr,String evt,Object evtData){
		if (evt==END_OF_MEDIA){
			try{
				player.setMediaTime(0);
				player.start();
				
			}catch (MediaException me){
				System.err.println(me);
				
			}
		}
	}
	public  synchronized void pauseApp(){
		suspended=true;
		if(player!=null&&player.getState()>=Player.STARTED){
			if(!isCapturePlayer){
				restartMediaTime=player.getMediaTime();
			}
			player.deallocate();
				restartOnResume=true;
			}else{
				restartOnResume=false;
				
			}
		
	}
	public synchronized void startApp(){
		suspended=false;
		if (player!=null&&restartOnResume){
			try{
				player.prefetch();
				if(!isCapturePlayer){
					try{
						player.setMediaTime(restartMediaTime);
						
					}catch (MediaException me){
						System.err.println(me);
					}
				}
				player.start();
			}catch (MediaException me){
				System.err.println(me);
			}
		}
		restartOnResume=false;
	}
	//提供抓图的功能
	private void doSnapshot(){
		final Canvas tThis =this ;
		new Thread (){
			public void run (){
				try {
					byte[] snap=vidc .getSnapshot("encoding=jpeg");
					
					if(snap!=null){
						Image im=Image.createImage(snap,0,snap.length);
						Alert al=new Alert("Snapshot","here's the snap",im,AlertType.INFO);
						al.setTimeout(2000);
						parentDisplay.setCurrent(al,tThis);
						
					}
				}catch (MediaException me){
					System.err.println(me);
				}
			}
		}.start();
	}
	//通过手机键盘和按键来控制
	public void keyPressed(int keyCode){
		int cr,cv;
		switch(keyCode){
		case Canvas.KEY_NUM4 :
			cr=rc.getRate();
			cr-=10000;
			cr=rc.setRate(cr);
			break;
		case Canvas.KEY_NUM6:
			cr=rc.getRate();
			cr+=10000;
			cr=rc.setRate(cr);
			break;
		case Canvas.KEY_STAR:
			if(vc!=null){
				cv=vc.getLevel();
				cv-=10;
				cv=vc.setLevel(cv);
				
			}
			break;
		case Canvas.KEY_NUM0:
			if(vc!=null){
				vc.setMute(!vc.isMuted());
				
			}
			break;
		case Canvas.KEY_POUND:
			if(vc!=null){
				cv=vc.getLevel();
				cv+=10;
				cv=vc.setLevel(cv);
				
			}
			break;
		case  Canvas.KEY_NUM7:
			if(fpc!=null){
				fpc.skip(-3);
			}
			break;
		case Canvas.KEY_NUM5:
			try{
				player.stop();
				if(!isCapturePlayer){
					player.setMediaTime(0);
				}
				player.deallocate();
			}catch (MediaException me){
				System.err.println(me);
			}
			break;
		case Canvas.KEY_NUM9:
			if(fpc!=null){
				fpc.skip(3);
				
			}
			break;
		case Canvas.KEY_NUM2:
			try{
				if(player.getState()==Player.STARTED){
					player.stop();
				    removeCommand(pauseCommand);
				    addCommand(playCommand);
				}
				else{
					player.start();
					removeCommand(playCommand);
					addCommand(pauseCommand);
				}
			}catch(Exception e){
				System.err.println(e);
				
			}
			break;
		case Canvas.KEY_NUM8:
			try{
				if(vidc!=null)
				 vidc.setDisplayFullScreen(fsmode=!fsmode);
				repaint();
			}catch (MediaException me){
				System.err.println(me);
			}
			break;
		//case Canvas.KEY_NUM1:
		case Canvas.KEY_NUM3:
			if (!isCapturePlayer){
				long mTime=player.getMediaTime();
				long duration=player.getDuration();
				if(duration==player.TIME_UNKNOWN||mTime==player.TIME_UNKNOWN)
				     return ;
				try{
					if(keyCode==Canvas.KEY_NUM1)
					{
						mTime -=duration/10;
						if(mTime<0)
							 mTime=0;
				        player.setMediaTime(mTime);
							                
		            }
					else if(keyCode==Canvas.KEY_NUM3)
					{
						mTime  =mTime+(duration /10);
						if(mTime>duration)
							mTime=duration;
						player.setMediaTime(mTime);
					}
					else
						return;
					
				}catch (MediaException me){
					System.err.println(me);
				}
			}
			break;
			default:
				int game =getGameAction(keyCode);
			  int x=vidc.getDisplayX();
			  int y=vidc.getDisplayY();
			  if(game==UP)
				  vidc.setDisplayLocation(x,y-10);
			  else if (game==DOWN)
				  vidc.setDisplayLocation(x,y+10);
			  else if (game==LEFT)
				  vidc.setDisplayLocation(x-10,y);
			  else if(game==RIGHT)
				  vidc.setDisplayLocation(x+10,y);
			  else if (game==FIRE)
				  vidc.setVisible(vis=!vis);
			  repaint();
			  break;
		}
	}
	
	//支持触摸屏的功能
	protected void pointerPressed(int x,int y){
		if (duration==Player.TIME_UNKNOWN||isCapturePlayer)
			return;
		if(y>=CB_Y&&y<CB_Y+CB_H){
			if(x>=VB_W-2&&x<=VB_W-2+videoW){
				x=x-(VB_W+1);
				if(x<0)
					x=0;
				if(x>videoW-TH_W)
					x=videoW-TH_W;
				long time =(duration*x)/(videoW-TH_W);
				try{
					player.setMediaTime(time);
					
				}catch (MediaException me){
					System.out.println(me);
				}
			}
		}
	}
	protected void pointerDragged(int x,int y){
		pointerPressed(x,y);
	}
	public void commandAction(Command c,Displayable s){
		if(s==this){
			if(c==backCommand){
				close();
				
			}else if (vidc!=null&&c==snapCommand){
				doSnapshot();
				
			}else if(vidc!=null&&c==pauseCommand){
				removeCommand(pauseCommand);
				addCommand(playCommand);
				pause();
			}else if (c==playCommand){
				start();
				removeCommand(playCommand);
				addCommand(pauseCommand);
			}
			
		}
	}

}

⌨️ 快捷键说明

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