处理独立程序的静默执行错误

silent execution bug with processing standalone program

我一直在尝试使用处理(3.0.2)作为显示视频的库。你可以在下面看到我的主要 class 的开头。我正在使用 Maven 在命令行上构建一个 运行 的胖 .jar。程序 运行s,不卡顿,可以关闭,但是没有视频...(下面的截图)问题是完全无声地发生:没有警告,没有崩溃。

我完全确定程序找到了视频文件,因为删除它会触发 RuntimeException

编辑: 好的,找到了文件,但没有找到框架。程序在尝试查找非零帧时卡住。

编辑 2: 看来这实际上是一个 GStreamer 问题。显然,Processing 不支持 GStreamer 1.x 沿袭。按照说明安装 GStreamer 0.1x here and here,不幸的是对我不起作用。

编辑 3: 尝试使用一个基本示例(下面的代码),我发现 Movie.read() 方法从未被触发,尽管 draw() 方法是。由于仍然没有错误或警告,我猜这是一个库问题。 有趣的是,当从 Processing IDE 作为 .pde 执行时,这段完全相同的代码工作得很好,所以那里一定有我缺少的库。有什么想法吗??

我的依赖项:

系统:Ubuntu 14.04 LTS,Java HotSpot(TM) 64 位服务器 VM(java 版本“1.8.0_77”),Processing 3.0。 2通过处理安装视频库IDE.


import processing.core.PApplet;
import processing.video.*;

public class TestMovie extends PApplet{

    Movie myMovie;

    public static void main(String[] args){
        PApplet.main(TestMovie.class.getName());
    }

    public void settings(){
        size(720, 480, FX2D);
    }

    public void setup() {
      //background(0);
        try{
            myMovie = new Movie(this, "red_45deg_284sec_500ml.mpg");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        myMovie.loop();
    }

    public void draw() {
      image(myMovie.get(), 0, 0);
      System.out.println("I'm drawing!");
    }

    // Called every time a new frame is available to read
    void movieEvent(Movie m) {
      try{
        m.read();
      }catch(Exception e){
          System.out.println(e.getMessage());
      }
      System.out.println("new frame!");
    }
}

所以,我终于可以播放电影了,毕竟它似乎不是库问题......出于某种神秘原因,movieEvent() 没有执行,很可能是因为没有触发事件.使用 Movie.available() 解决如下:

public class TestMovie extends PApplet{

    Movie myMovie;

    public static void main(String[] args){
        PApplet.main(TestMovie.class.getName());
    }

    public void settings(){
        size(720, 480, FX2D);
    }

    public void setup() {
      //background(0);
        try{
            myMovie = new Movie(this, "red_45deg_284sec_500ml.mpg");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        myMovie.loop();
    }

    public void draw() {
        if (myMovie.available()) {
            myMovie.read();
          }
          image(myMovie, 0, 0);
    }
}