Runtime und Process Probleme

  • Hallo,


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

    Code
    .
    .
    .
    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:



    [font="Tahoma, Verdana, Arial, sans-serif"]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. [/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]Ich hoffe ich konnte mein Problem beschreiben und mir kann jemand ein Denkanstoß geben. Wie immer vielen dank für jegliche Hilfe.[/font]

  • Du kannst sehr einfach so etwas selbst rausfinden, indem du mal zwei Shells startest & in jeder jeweils ein ffmpeg-Kommando mit dem gemeinsamen mp4 Anstößt. Da siehst du dann schon, ob die sich blockieren oder nicht.

    Wenn nicht - dann ist es deine Programmlogik. Ich haette da auch einen heissen Kandidaten... aber da "warte ich noch drauf" den zu verraten :D

  • Na ja das ganze läuft ja nicht mal parallel. Das ist ja gerade der Witz. Ich starte ja den ersten Prozess in dem FFMPEG das Video bearbeitet und durch p.waitFor(); warte ich ja bis der Prozess beendet ist. Und erst dann starte ich ja die neue Methode in der ich wiederum mit einen Prozess FFMPEG starte welches wiederum auf die zuvor erstellte Videodatei zugreifen soll.
    Daher war meine Vermutung ja das Java die Datei irgend wie sperrt. Ist ja nicht so abwegig;)

    Aber meiner Meinung nach müsste der Prozess ja auch komplett aus dem Speicher sein da die Methode ja beendet ist oder?

    Aber vlt. Liegt es auch an der Programmlogik. Was ist den dein Tipp?

  • Dann war das ein Missvertaendnis, ich habe deine Beschreibung schon so verstanden, dass du das parallelisieren willst. Und gesperrte Dateien unter Unix, und auch Java, sind unueblich. Das muss man explizit anfordern (anders als bei Windows). Darum wuerde ich davon nicht ausgehen. Vor allem sehe ich nicht, wo du die Datei selbst von Java aus "anfasst". Java hat keine Ahnung davon, was dein System-call tut. Ob das Dateinamen oder Einhornspitznamen sind, das kann es nicht wissen und macht da auch nix mit.

  • 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:

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


    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?

  • Hast du dir mal die Mühe gemacht, die Doku zur Process-Klasse zu lesen? https://docs.oracle.com/javase/7/docs/…ng/Process.html

    Da steht "The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock."

    Ausserdem solltest du den ProcessBuilder benutzen, mit dem kannst du die Standardausgaben (stdout/stderr) auch gleich auf dein bestehendes Terminal umlenken lassen, oder in eine Log-Datei. So das da nix mehr blockieren sollte.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!