2012-06-23 111 views
2

비디오 코드를 인코딩하기 위해 Java 코드를 통해 ffmpeg.exe을 실행 중입니다. ffmpeg가 종료되면 (예 : 비디오 파일이 인코딩 된 경우) 내 프로그램에서 어떻게 알 수 있습니까?언제 ffmpeg가 종료됩니까?

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

공백이 포함 된 경로 나 파일 이름을 발견하면 매우 약한 방법으로 '프로세스'를 구성 할 수 있습니다. 일반적인 팁. 1) 인수 배열을 허용하는 메소드를 사용하십시오. 2) 1.5+ 코드에 대해'ProcessBuilder'를 사용하면 약간 더 간단 해집니다. 3) [Runtime.exec()가 실행되지 않을 때]의 모든 제안을 구현하십시오. (http://www.javaworld.com/javaworld/ jw-12-2000/jw-1229-traps.html) BTW - 왜 jffmpeg 대신 ffmpeg를 사용합니까? –

+1

이것이 Xuggle과 어떤 관련이 있습니까? 필자가 알고있는 ffmpeg와 Xuggle은 완전히 별개의 프로젝트입니다. –

+0

jffmpeg에 대해 알지 못했습니다. 감사합니다. –

답변

4

당신은 java.lang.ProcesswaitFor() 방법을 사용할 수 있습니다 : 여기

이 코드이와

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()); 
+0

이것은 ffmpeg에서 작동하지 않습니다. –

+0

무슨 일입니까? 어떤 오류가 있습니까? – jalopaba

+0

아니요 현재 스레드와 부모 스레드 모두 대기 상태가됩니다. 그리고 비디오 인코딩도 일시 중지됩니다. –

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