ProcessBuilder在Mac上提供“没有这样的文件或目录”,而Runtime()。exec()工作正常

我有一个在Playframework上运行的应用程序,它需要对一些video文件进行编码。 我用了

Process pr = Runtime.getRuntime().exec(execCode) 

为此(它完美地工作),但由于我需要输出流和错误流,我试图使用ProcessBuilder(也建议使用)。

但我无法让它工作(在MacBook上测试)。 Runtime方法和ProcessBuilder之间有根本区别吗?

这是我的ProcessBuilder代码(完全相同的代码在被Runtime.getRuntime().exec()替换时有效Runtime.getRuntime().exec()

  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.(UNIXProcess.java:53) at java.lang.ProcessImpl.start(ProcessImpl.java:91) at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) ... 12 more 

您需要将参数指定为单独的Strings

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

构造函数接受StringvarargsList

请参阅ProcessBuilder文档 。