Threads Runtime und Process Probleme

Dieses Thema Threads - Runtime und Process Probleme im Forum "Allgemeine Java-Themen" wurde erstellt von kosa, 9. Dez. 2016.

Thema: Runtime und Process Probleme Hallo, bin neu in diesen Forum darum nicht gleich schlage wenn ich im falschen Forum gepostet habe oder nicht in...

  1. Hallo,

    bin neu in diesen Forum darum nicht gleich schlage wenn ich im falschen Forum gepostet habe oder nicht in der lage war die such richtig zu nutzen;)

    ich hab ein kleine Problem und zwar hab ich ein Programm in den ich mehrere Prozesse und Runtime erzeuge ganz simple nach folgenden muster:


    .
    .
    .
    p = r.exec("cmd /c " + command);
    p.waitFor();
    .
    .
    .

    command beinhaltet meistens ein FFMPEG Aufruf mit allen dazugehörigen Parametern. Das klappt soweit auch alles ganz gut. Nun zu mein Problem:


    Ich erzeuge halt nach und nach durch das obige Muster eine neue Videodatei (beispielsweise: rohmaterial.mp4) Sobald ich aber nun einen neuen Prozess starte in dem FFMPEG auf die erstellte Datei zugreifen soll bleibt es hängen.


    Ich persönlich glaube dass die Datei noch irgend wie gespart ist und das Programm deshalb hängen bleibt. Kann das sein? Wenn ja wie kann ich diese sperre aufheben? Bzw. ist meine Vermutung völlig falsch?


    Hier noch ein bisschen mehr code:


    private void sound_video_zusammenfuegen (String pfad_Sound, String pfad_Video, String pfad_ffmpeg, String pfad_Ziel_Video) {
    String command;
    Runtime r = Runtime.getRuntime();
    Process p;
    String ret;

    command = pfad_ffmpeg + " -i " + pfad_Video + " -i " + pfad_Sound + " -vcodec copy " + pfad_Ziel_Video ;
    try {
    p = r.exec("cmd /c " + command);
    p.waitFor();
    } catch(Exception e) {
    System.out.println("norp");
    }
    }


    Ich ruf in der main methode eigentlich sound_video_zusammenfuegen auf und möchte danach eine andere Methode aufrufen welche wiederum auf das erstellte Video String pfad_Ziel_Video String pfad_Ziel_Video zugreifen soll und dort hängt sich mein Programm auf.
    Ich hoffe ich konnte mein Problem beschreiben und mir kann jemand ein Denkanstoß geben. Wie immer vielen dank für jegliche Hilfe.
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. So... ich glaub ich habe mein problem falsch geschildert. Darum versuche ich es noch mal neu:
    Ich hab mein Java Programm in der es folgende Methode gibt (Button wird Betätigt):

    Code (Java):
    private void MyButtonActionPerformed(java.awt.event.ActionEvent evt) {
       // TODO add your handling code here:
       // Welcher schnitt wurde gewählt
       switch (auftrag.videotyp) { // 1 -> Highlightschnitt 2 -> Zusammenfassung 3 -> Torschnitt 4 -> Ganze Spiel
         case 1:
           // code
           break;
         case 2:
           // code
           break;
         case 3:
           // code
           break;
         case 4:
           // rohVideo[1] = speicherpfad + "/Rohmaterial/KameraMZuschnittOhneSound.mp4";
           // video_schneiden (auftrag.kamera[1], auftrag.pfad_ffmpeg, rohVideo[1], auftrag.kameravorlauf[1],String.valueOf(Integer.parseInt(rohvideolaenge[1]) - Integer.parseInt(auftrag.kameranachlauf[1])));
           // rohvideolaenge[1].substring(0,rohvideolaenge[1].indexOf('.'));
           String zs1 = videolaenge_ermitteln (rohVideoSound[1],auftrag.pfad_ffprobe);
           zs1 = zs1.substring(0, zs1.indexOf('.'));
           
           int beginnzweitehalbzeit = (Integer.parseInt(auftrag.LaengeHalbzeit) + Integer.parseInt(auftrag.PauseLaenge));
           int dauerzweitehalbzeit = Integer.parseInt(zs1) - beginnzweitehalbzeit;
           
           String[] zs = new String[2];
           zs[0] = speicherpfad + "/Schnitt/GanzeSpielEineKameraErsteHalbzeit.mp4";
           zs[1] = speicherpfad + "/Schnitt/GanzeSpielEineKameraZweiteHalbzeit.mp4";
           
           video_schneiden (rohVideoSound[1], auftrag.pfad_ffmpeg, zs[0], "0", auftrag.LaengeHalbzeit);
           video_schneiden (rohVideoSound[1], auftrag.pfad_ffmpeg, zs[1], Integer.toString(beginnzweitehalbzeit) , Integer.toString(dauerzweitehalbzeit));
           video_zusammenfuegen (zs, auftrag.pfad_ffmpeg, speicherpfad + "/End-Video/GanzeSpielEineKamera.mp4");
           
           split_screen (rohVideoSound[1], rohVideoSound[1], "" , auftrag.pfad_ffmpeg, speicherpfad + "/End-Video/split.mp4");
           
           if (auftrag.kameraanzahl == 4) {
             // code
           }
           break;
       }
    }

    Und nun kommt das Problem... Bei der Methode split_screen:



    Code (Java):
    private void split_screen (String pfad_Video_1, String pfad_Video_2, String pfad_Video_3, String pfad_ffmpeg, String pfad_Ziel_video) {
       String command;
       Runtime r = Runtime.getRuntime();
       Process p;

       // ffmpeg -i input0 -i input1 -filter_complex vstack output
       command = pfad_ffmpeg + " -i " + pfad_Video_1 + " -i " + pfad_Video_2 + " -filter_complex vstack " + pfad_Ziel_video;

       try {
         p = r.exec("cmd /c " + command);
         //p.waitFor();
       } catch(Exception e) {
         System.out.println("norp");
       }
    }


    Was soll nun eigentlich passieren:

    Wenn der Button betätigt wurde finden ein prüfung statt was eigentlich gemacht werden soll und anhand dessen werden verschieden Methoden ausgeführt (Switch, private void MyButtonActionPerformed)


    Wenn die Auswahl 4 getroffen wurde soll die Methode split_screen aufgerufen werden welche übber FFMPEG die übergebenen Videopfade zu einen splitscreen zusammenfügen.


    Das Problem ist die Methode split_screen:

    Die Ausgangsdatei wird erstellt und ist 1kb groß... Dabei bleibt es aber auch, der Prozess wird nicht weiter ausgeführt... erst wenn ich die Java Anwendung beende startet mein Rechner durch und ffmpeg arbeitet in Hintergrund und erstellt die komplette Datei.

    Was muss ich tun oder abändern dass FFMPEG weiterarbeitet und nicht erst los legt wenn ich die ganze Anwendung beende?
     
    Zuletzt von einem Moderator bearbeitet: 12. Dez. 2016
  4. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!