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



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

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

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

编辑2:似乎这实际上是一个GStreamer问题。显然,处理不支持GStreamer 1.x世系。按照此处和此处的说明安装 GStreamer 0.1x,不幸的是对我不起作用。

编辑3:尝试使用基本示例(下面的代码),我看到Movie.read()方法从未被触发,尽管draw()方法被触发。由于仍然没有错误或警告,我想这是库问题。有趣的是,当从处理 IDE 作为 .pde 执行时,相同的代码可以完美运行,因此那里一定有一个我缺少的库。任何想法??

我的依赖项:

  • 核心.jar
  • 视频.jar
  • 日报.jar
  • gstreamer-java.jar

系统:Ubuntu 14.04 LTS,Java HotSpot(TM) 64 位服务器虚拟机(java 版本"1.8.0_77"),处理 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);
    }
}

最新更新