2016-04-22 5 views
0

Ich habe versucht, Verarbeitung (3.0.2) als eine Lib zu verwenden, um Video anzuzeigen. Sie können den Anfang meiner Hauptklasse unten sehen. Ich benutze Maven, um eine fette .jar-Datei zu erstellen, die ich in der Befehlszeile ausfühle. Das Programm läuft, nicht einfrieren, und kann geschlossen werden, aber kein Video ... (Screenshot unten) Das Problem ist, dass passiert völlig still: keine Warnung, kein Absturz.Silent Execution Bug mit der Verarbeitung Standalone-Programm

Ich bin mir absolut sicher, dass die Videodatei vom Programm gefunden wird, da das Löschen eine RuntimeException auslöst.

Bearbeiten: Ok, so wird die Datei gefunden, aber nicht die Frames. Das Programm versucht, einen von Null verschiedenen Frame zu finden.

Bearbeiten 2: Es scheint, es ist in der Tat ein GStreamer-Problem. Offenbar unterstützt die Verarbeitung die GStreamer-1.x-Abstammung nicht. Die Installation von GStreamer 0.1x wie erklärt here und here, funktionierte leider nicht für mich.

bearbeiten 3: mit einem einfachen Beispiel (Code unten) Der Versuch, wie ich sehe, dass die Movie.read() Methode nie ausgelöst wird, obwohl die draw() Methode. Da es immer noch keine Fehler oder Warnungen gibt, denke ich, es ist ein Bibliotheksproblem. Interessanterweise funktioniert derselbe Code perfekt, wenn er als .pde von der Processing-IDE ausgeführt wird, also muss dort eine Bibliothek vorhanden sein, die mir fehlt. Irgendwelche Ideen ??

Meine Abhängigkeiten:

  • core.jar
  • video.jar
  • jna.jar
  • gstreamer-java.jar

System: Ubuntu 14.04 LTS, Java HotSpot (TM) 64-Bit-Server-VM (Java-Version "1.8.0_77"), Verarbeitung von 3.0.2 mit einer über die Verarbeitungs-IDE installierten Videobibliothek.


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!"); 
    } 
} 
+0

Sieht aus wie das Verhalten erwartet wird: Sie das Video bis zum ersten Frame gerade lesen, die nicht die Größe (0,0) hat und dann extrahieren Sie ein einzelnes Bild von ihm und zeige das anstelle des Videos (zumindest sieht der Code so aus). – Tom

+0

@Tom Dies liegt daran, dass ich aufgrund des Interlacings einen großen Schnappschuss und 4 kleinere "Bildschirme" anzeigen möchte, die die Deinterlaced-Frames anzeigen. – Raoul

Antwort

0

Also, ich habe endlich den Film spielen, und es scheint nicht, eine Bibliothek Problem doch aus unerfindlichen Gründen ... zu sein, nicht movieEvent() nicht ausführen, höchstwahrscheinlich, weil kein Ereignis ist Ausgelöst. Movie.available() Mit löste es wie folgt:

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); 
    } 
}