Wanneer eindigt ffmpeg?

Ik gebruik ffmpeg.exe via een Java-code om een ​​videobestand te coderen. Hoe zal mijn programma leren kennen wanneer ffmpeg wordt beëindigd (dat wil zeggen, het videobestand is gecodeerd)?

Hier is de code:

Runtime.getRuntime().exec("ffmpeg -ac 2 -i audio.wav -i video.flv -sameq out.flv");
2
Ik was niet op de hoogte van jffmpeg. Dank je wel.
toegevoegd de auteur devashish jasani, de bron
Je zult ontdekken dat dit een zeer fragiele manier is om een ​​ Proces te construeren wanneer het een pad of bestandsnaam tegenkomt die een spatie bevat. Als algemene tips. 1) Gebruik de methoden die een reeks argumenten accepteren. 2) Gebruik een ProcessBuilder voor 1.5+ code, die het dan iets eenvoudiger maakt om 3) Alle suggesties van Wanneer Runtime.exec() niet zal worden gebruikt BTW - waarom zou u ffmpeg gebruiken in plaats van jffmpeg?
toegevoegd de auteur Andrew Thompson, de bron
Wat heeft dit met Xuggle te maken? Voor zover ik weet, zijn ffmpeg & Xuggle volledig afzonderlijke projecten.
toegevoegd de auteur Andrew Thompson, de bron

2 antwoord

U kunt de methode waitFor() van java.lang.Process :

Process p = Runtime.getRuntime().exec("ffmpeg...");
int exitValue = p.waitFor()

Hiermee wacht de huidige thread totdat de Process p is beëindigd.

BEWERK:

U kunt proberen de uitvoer van ffmpeg te zien:

class StreamDump implements Runnable {

    private InputStream stream;

    StreamDump(InputStream input) {
        this.stream = input;
    }

    public void run() {
        try {
            int c;
            while ((c = stream.read()) != -1) {
                System.out.write(c);
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

en

Process p = Runtime.getRuntime().exec("ffmpeg.exe...");
new Thread(new StreamDump(p.getErrorStream()), "error stream").start();
new Thread(new StreamDump(p.getInputStream()), "output stream").start();
try {
    p.waitFor();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("Exit value: " + p.exitValue());
4
toegevoegd
dit werkt niet met ffmpeg.
toegevoegd de auteur devashish jasani, de bron
Nee, de huidige thread en de bovenliggende thread gaan allebei naar de wachtstand.En de videocodering pauzeert ook.
toegevoegd de auteur devashish jasani, de bron
Windows 7-besturingssysteem
toegevoegd de auteur devashish jasani, de bron
U mist haakjes, het moet Runtime.getRuntime (). Exec ("ffmpeg ...") zijn;
toegevoegd de auteur NPE, de bron
Wat is er gaande? Krijgt u een foutmelding?
toegevoegd de auteur jalopaba, de bron
Welk besturingssysteem gebruikt u?
toegevoegd de auteur jalopaba, de bron
Bedankt voor de heads-up @NPE, dienovereenkomstig bewerkt.
toegevoegd de auteur jalopaba, de bron

Ik vond een probleem, als het bestand out.flv wordt geprobeerd te hernoemen terwijl het wordt gecodeerd, zou het niet toestaan. Het kan alleen worden hernoemd nadat de codering is voltooid:

Runtime.getRuntime().exec("ffmpeg -ac 2 -i audio.wav -i video.flv -sameq out.flv");

File tempFile=new File("out.flv");
File renamedFile=new File("renamed.flv");
while(!tempFile.renameTo(renamedFile)); //try re-naming the file which is being encoded by ffmpeg

System.out.println("Encoding done");
0
toegevoegd