📄 videocanvas.java
字号:
/* * @(#)VideoCanvas.java 1.6 04/03/10 * * Copyright (c) 2000-2004 Sun Microsystems, Inc. All rights reserved. * PROPRIETARY/CONFIDENTIAL * Use is subject to license terms */package example.mmademo;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;import javax.microedition.media.*;import javax.microedition.media.control.*;import java.io.*;/** * Play/Capture Video in a Canvas * */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.BACK, 1); private Command playCommand = new Command("Play", Command.ITEM, 1); private Command snapCommand = new Command("Snapshot", Command.ITEM, 1); private Command pauseCommand = new Command("Pause", Command.ITEM, 10); private VolumeControl vc; private RateControl rc; private VideoControl vidc; private FramePositioningControl fpc; private int CB_Y = 0; // Control Bar Y location private static final int CB_H = 8; // Control Bar Height private static final int TH_W = 6; // Slider Thumb Width private static final int VB_W = 10; // Video Border Width private static final int VB_H = 8; // Video Border Height private boolean vis = true; private int canvasW; // Canvas Width private int canvasH; // Canvas Height private int videoW; // Video Display Area Width private int videoH; // Video Display Area Height // pause/resume support private boolean suspended = false; private boolean restartOnResume = false; private long restartMediaTime; 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(); } public void paint(Graphics g) { // Only video player uses the screen in fullscreen mode if (fsmode) return; // Draw the GUI and media time slider g.setColor(0x9090E0); g.fillRect(0, 0, canvasW, canvasH); g.setColor(0x202050); //Video Border 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); //Control Bar 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); //Video Border 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); //Control Bar 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 void initialize() { addCommand(backCommand); addCommand(snapCommand); setCommandListener(this); } 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; } 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); } // sleep for 250 millis // if suspended, sleep until the MIDlet is restarted do { Thread.sleep(250); } while (player != null && suspended); } catch (Exception e) { System.err.println("In run(): "+e); break; } } } /* * Respond to commands, including back */ public void commandAction(Command c, Displayable s) { if (s == this) { if (c == backCommand) { close(); parentDisplay.setCurrent(VideoTest.getList()); } else if (vidc != null && c == snapCommand) { doSnapshot(); } else if (vidc == null && c == pauseCommand) { removeCommand(pauseCommand); addCommand(playCommand); pause(); } else if (vidc == null && c == playCommand) { start(); removeCommand(playCommand); addCommand(pauseCommand); } } } /* * Process clicking in slider region */ 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 open(String url) { try { synchronized (this) { if ( player == null ) { if (url.startsWith("resource:")) { InputStream ins = getClass().getResourceAsStream(url.substring(9)); String ct = Utils.guessContentType(url); 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(); // Clip the video to available area 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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -