ProcessBuilder 在 Mac 上给出“没有这样的文件或目录”,而 Runtime().exec() 工作正常
Posted
技术标签:
【中文标题】ProcessBuilder 在 Mac 上给出“没有这样的文件或目录”,而 Runtime().exec() 工作正常【英文标题】:ProcessBuilder gives a "No such file or directory" on Mac while Runtime().exec() works fine 【发布时间】:2012-05-30 21:57:04 【问题描述】:我有一个在 Playframework 上运行的应用程序,它需要对一些视频文件进行编码。我用过
Process pr = Runtime.getRuntime().exec(execCode)
为此(它工作得很好),但由于我需要输出流和错误流,我正在尝试使用 ProcessBuilder(也推荐使用)。
但我无法让它工作(在 MacBook 上测试)。 Runtime 方法和 ProcessBuilder 有根本的区别吗?
这是我的 ProcessBuilder 代码(完全相同的代码在替换为 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.<init>(UNIXProcess.java:53)
at java.lang.ProcessImpl.start(ProcessImpl.java:91)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 12 more
【问题讨论】:
【参考方案1】:您需要将参数指定为单独的Strings
:
new ProcessBuilder("cmd", "arg1", "arg2", ...);
构造函数接受String
、varargs
和List<String>
。
见ProcessBuilder documentation。
【讨论】:
我在该列表中也找不到FSTL
感谢您的解决方案。让我摆脱了压力。
ffmpeg 也有同样的问题,这节省了我的时间;如果 command 是您将与 exec() 一起使用的命令,那么一个简单的 command.split(" ") 就可以解决问题
如果构造函数接受一个字符串,为什么我们需要将参数指定为单独的字符串(varargs)?以上是关于ProcessBuilder 在 Mac 上给出“没有这样的文件或目录”,而 Runtime().exec() 工作正常的主要内容,如果未能解决你的问题,请参考以下文章
NSLinguisticTagger 在 Mac 和 iOS 上给出不同的输出
在 MAC 上使用 anaconda python 的 Pyqtgraph 给出 nib 错误