movie.java

来自「This is processing for java examples.」· Java 代码 · 共 737 行 · 第 1/2 页

JAVA
737
字号
        // 0106: tried adding sleep time so this doesn't spin out of control        // works fine but doesn't really help anything        //try {        //Thread.sleep(5);        //} catch (InterruptedException e) { }      }      movie.setRate(1);      fps = ifps;      runner = new Thread(this);      runner.start();      // register methods      parent.registerDispose(this);      try {        movieEventMethod =          parent.getClass().getMethod("movieEvent",                                      new Class[] { Movie.class });      } catch (Exception e) {        // no such method, or an error.. which is fine, just ignore      }    } catch (QTException qte) {      qte.printStackTrace();    } catch (Exception e) {      e.printStackTrace();    }  }  */  public boolean available() {    return available;  }  public void read() {    try {      if (firstFrame) {        movieRect = movie.getBox();        //movieGraphics = new QDGraphics(movieRect);        if (quicktime.util.EndianOrder.isNativeLittleEndian()) {          movieGraphics =            new QDGraphics(QDConstants.k32BGRAPixelFormat, movieRect);        } else {          movieGraphics =            new QDGraphics(QDGraphics.kDefaultPixelFormat, movieRect);        }      }      Pict pict = movie.getPict(movie.getTime());  // returns an int      pict.draw(movieGraphics, movieRect);      PixMap pixmap = movieGraphics.getPixMap();      raw = pixmap.getPixelData();      // It needs to get at least a small part      // of the video to get the parameters      if (firstFrame) {        //int intsPerRow = pixmap.getRowBytes() / 4;        int movieWidth = movieRect.getWidth();        int movieHeight = movieRect.getHeight();        int j = raw.getRowBytes() - movieWidth*4;        // this doesn't round up.. does it need to?        int k = j / 4;        int dataWidth = movieWidth + k;        if (dataWidth != movieWidth) {          if (removeBorders) {            borderImage = new PImage(dataWidth, movieHeight, RGB);          } else {            movieWidth = dataWidth;          }        }        //int vpixels[] = new int[movieWidth * movieHeight];        //image = new PImage(vpixels, movieWidth, movieHeight, RGB);        super.init(movieWidth, movieHeight, RGB);        //parent.video = image;        firstFrame = false;      }      // this happens later (found by hernando)      //raw.copyToArray(0, image.pixels, 0, image.width * image.height);      loadPixels();      // this is identical to a chunk of code inside PCamera      // this might be a candidate to move up to PVideo or something      if (borderImage != null) {  // need to remove borders        raw.copyToArray(0, borderImage.pixels,                        0, borderImage.width * borderImage.height);        int borderIndex = 0;        int targetIndex = 0;        for (int i = 0; i < height; i++) {          System.arraycopy(borderImage.pixels, borderIndex,                           pixels, targetIndex, width);          borderIndex += borderImage.width;          targetIndex += width;        }      } else {  // just copy directly        raw.copyToArray(0, pixels, 0, width * height);      }      // ready to rock      //System.out.println("updating pixels");      //updatePixels();  // mark as modified      updatePixels();    } catch (QTException qte) {      qte.printStackTrace();      //QTSession.close();  // let dispose() handle it    }  }  /**   * Begin playing the movie, with no repeat.   */  public void play() {//    if (runner != null) {//      stop();//    }    play = true;//    runner = new Thread(this);//    runner.start();  }  /**   * Begin playing the movie, with repeat.   */  public void loop() {    play();    repeat = true;  }  /**   * Shut off the repeating loop.   */  public void noLoop() {    repeat = false;  }  /**   * Pause the movie at its current time.   */  public void pause() {    play = false;    //System.out.println("pause");  }  /**   * Stop the movie, and rewind.   */  public void stop() {    play = false;//    runner = null;    try {      movie.setTimeValue(0);    } catch (StdQTException e) {      errorMessage("stop", e);    }  }  /**   * Set how often new frames are to be read from the movie.   * Does not actually set the speed of the movie playback,   * that's handled by the speed() method.   */  public void frameRate(int ifps) {    if (ifps <= 0) {      System.err.println("Movie: ignoring bad frame rate of " +                         ifps + " fps.");    } else {      fps = ifps;    }  }  /**   * Set a multiplier for how fast/slow the movie should be run.   * The default is 1.0.   * <UL>   * <LI>speed(2) will play the movie at double speed (2x).   * <LI>speed(0.5) will play at half speed.   * <LI>speed(-1) will play backwards at regular speed.   * </UL>   */  public void speed(float rate) {    //rate = irate;    try {      movie.setRate(rate);    } catch (StdQTException e) {      errorMessage("speed", e);    }  }  /**   * Return the current time in seconds.   * The number is a float so fractions of seconds can be used.   */  public float time() {    try {      return (float)movie.getTime() / (float)movie.getTimeScale();    } catch (StdQTException e) {      errorMessage("time", e);    }    return -1;  }  /**   * Jump to a specific location (in seconds).   * The number is a float so fractions of seconds can be used.   */  public void jump(float where) {    try {      //movie.setTime(new TimeRecord(rate, where));  // scale, value      //movie.setTime(new TimeRecord(1, where));  // scale, value      int scaledTime = (int) (where * movie.getTimeScale());      movie.setTimeValue(scaledTime);    } catch (StdQTException e) {      errorMessage("jump", e);    }  }  /**   * Get the full length of this movie (in seconds).   */  public float duration() {    try {      return (float)movie.getDuration() / (float)movie.getTimeScale();    } catch (StdQTException e) {      errorMessage("length", e);    }    return -1;  }  /*  public void play() {    if(!play) {      play = true;    }    start();    while( image == null) {      try {        Thread.sleep(5);      } catch (InterruptedException e) { }    }    pixels = image.pixels;    width = image.width;    height = image.height;  }  public void repeat() {    loop = true;    if(!play) {      play = true;    }    start();    while( image == null) {      try {        Thread.sleep(5);      } catch (InterruptedException e) { }    }    pixels = image.pixels;    width = image.width;    height = image.height;  }  public void pause() {    play = false;  }  */  public void run() {    //System.out.println("entering thread");    while (Thread.currentThread() == runner) {      //System.out.print("<");      try {        //Thread.sleep(5);        Thread.sleep(1000 / fps);      } catch (InterruptedException e) { }      //System.out.print(">");      // this could be a lie, but..      if (play) {        //read();        //System.out.println("play");        available = true;        if (movieEventMethod == null) {          // If no special handling, then automatically read from the movie.          read();        } else {          try {            movieEventMethod.invoke(parent, new Object[] { this });          } catch (Exception e) {            System.err.println("error, disabling movieEvent() for " +                               filename);            e.printStackTrace();            movieEventMethod = null;          }        }        try {          if (movie.isDone() && repeat) {            movie.goToBeginning();          }        } catch (StdQTException e) {          play = false;          errorMessage("rewinding", e);        }        //} else {        //System.out.println("no play");      }      //try {      //read();      //if (movie.isDone() && loop) movie.goToBeginning();      //} catch (QTException e) {      //System.err.println("Movie exception");      //e.printStackTrace();      //QTSession.close(); ??      //}    }  }  /**   * Call this to halt the movie from running, and stop its thread.   */  public void dispose() {    stop();    runner = null;    QTSession.close();  }  /**   * General error reporting, all corraled here just in case   * I think of something slightly more intelligent to do.   */  protected void errorMessage(String where, Exception e) {    parent.die("Error inside Movie." + where + "()", e);  }}

⌨️ 快捷键说明

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