2012-05-24 1 views
23

일부 비디오 파일을 인코딩해야하는 Playframework에서 실행되는 응용 프로그램이 있습니다. "Process pr = Runtime.getRuntime(). exec (execCode)"를 사용했는데 (완벽하게 작동합니다.) 출력 스트림과 오류 스트림이 모두 필요하므로 ProcessBuilder를 사용하려고합니다 (권장 됨) .Runtime(). exec()가 잘 작동하는 동안 Process Builder는 "No such file or directory"를 제공합니다.

하지만 작동하지 않습니다 (MacBook에서 테스트). 런타임 메소드와 ProcessBuilder의 근본적인 차이점이 있습니까?

이것은 ProcessBuilder를 내 코드입니다 (Runtime.getRuntime()로 대체 할 때 정확히 같은 코드가 작동 간부 인().)

String execCode = "/opt/local/bin/ffmpeg -i file [...]"; 
    ProcessBuilder pb = new ProcessBuilder(execCode); 
    pb.redirectErrorStream(true); 
    pb.directory(new File("/Users/[...]/data/")); 
    Process pr = pb.start(); 

이 콘솔 출력 :

11:00:18,277 ERROR ~ There was a problem with with processing MediaFile[13] with error Error during coding process: Cannot run program "/opt/local/bin/ffmpeg -i /Users/[...]/data/media/1/1/test.mov [...] /Users/[...]/data/media/1/13/encoded.mp3" (in directory "/Users/[...]/data"): error=2, No such file or directory 
java.lang.Exception: Error during coding process: Cannot run program "/opt/local/bin/ffmpeg -i /Users/Luuk/Documents/Java/idoms-server/data/media/1/1/test.mov -y -f mpegts -acodec libmp3lame -ar 48000 -b:a 64000 -vn -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate -1 -bufsize -1 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -g 30 -async 2 /Users/Luuk/Documents/Java/idoms-server/data/media/1/13/encoded.mp3" (in directory "/Users/Luuk/Documents/Java/idoms-server/data"): error=2, No such file or directory 
    at logic.server.MediaCoder.encodeMediaFile(MediaCoder.java:313) 
    at logic.server.MediaCoder.doJob(MediaCoder.java:54) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.io.IOException: Cannot run program "/opt/local/bin/ffmpeg -i /Users/Luuk/Documents/Java/idoms-server/data/media/1/1/test.mov -y -f mpegts -acodec libmp3lame -ar 48000 -b:a 64000 -vn -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate -1 -bufsize -1 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -g 30 -async 2 /Users/Luuk/Documents/Java/idoms-server/data/media/1/13/encoded.mp3" (in directory "/Users/Luuk/Documents/Java/idoms-server/data"): error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at logic.server.MediaCoder.encodeMediaFile(MediaCoder.java:189) 
    ... 11 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:53) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:91) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 
    ... 12 more 

답변

47

당신에게 인수를 별도로 지정해야 함

new ProcessBuilder("cmd", "arg1", "arg2", ...); 

생성자 String, varargsList<String>을 허용합니다.

ProcessBuilder documentation을 참조하십시오.

+0

또한 해당 목록에서'FSTL'을 찾을 수 없습니다. – SSpoke

+0

해결책 주셔서 감사합니다. 스트레스를 덜어주었습니다. – Mohit

+1

ffmpeg에서도 같은 문제가 발생했습니다. command가 exec()와 함께 사용하는 명령이면 간단한 command.split ("")이 트릭을 수행해야합니다. –