4

ffmpeg.exeビデオファイルをエンコードするためにJavaコードを実行しています。ffmpegが終了したとき(つまり、ビデオファイルがエンコードされたとき)、プログラムはどのようにして知ることができますか?

コードは次のとおりです。

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

2 に答える 2

5

waitFor()次のメソッドを使用できますjava.lang.Process

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

これにより、現在のスレッドはが終了するまで待機しProcess pます。

編集:

あなたはffmpegからの出力を見ることを試みることができます:

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

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());
于 2012-06-23T21:12:49.363 に答える
0

私は回避策を見つけました、それがエンコードされている間にファイルout.flvが名前を変更しようとすると、それは許可されません、それはエンコードが終わった後にのみ名前を変更することができます:

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");
于 2012-06-23T22:29:11.467 に答える