简体   繁体   English

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

[英]ProcessBuilder gives a "No such file or directory" on Mac while Runtime().exec() works fine

I have an application, running on the Playframework, which needs to encode some video files.我有一个应用程序,运行在 Playframework 上,需要对一些视频文件进行编码。 I used我用了

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

for this (and it works perfectly), but as I need both, the output stream and the error stream, I am trying to use ProcessBuilder (as is also recommended).为此(它工作得很好),但由于我同时需要 output stream 和错误 stream,我正在尝试使用 ProcessBuilder(同样推荐)。

But I cannot get it to work (testing on a MacBook).但我无法让它工作(在 MacBook 上测试)。 Is there a fundamental difference between the Runtime method and the ProcessBuilder? Runtime 方法和 ProcessBuilder 之间有根本区别吗?

This is my code for ProcessBuilder (exactly the same code works when replaced by Runtime.getRuntime().exec() )这是我的 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();

This is the console output:这是控制台 output:

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

You need to specify the arguments as separate Strings : 您需要将参数指定为单独的Strings

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

The constructor accepts String , varargs , and List<String> . 构造函数接受StringvarargsList<String>

See ProcessBuilder documentation . 请参阅ProcessBuilder文档

If you don't want to break your commands into tokens everytime, you could try如果您不想每次都将命令分解为标记,您可以尝试

new ProcessBuilder("sh", "-c", execCode); // Linux / Unix terminal

OR或者

new ProcessBuilder("cmd", "/c", execCode); // Windows command line

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ProcessBuilder - 没有这样的文件或目录(但Runtime.exec()有效) - ProcessBuilder - No such file or directory (but Runtime.exec() works) 为什么Java Processbuilder不能在其自己的目录中运行PMCMD(informatica命令),但可以在命令提示符下正常运行 - Why PMCMD (informatica command) is not run by Java Processbuilder from its own directory while it works fine with command prompt 当调用运行时exec工作的系统命令时,ProcessBuilder失败 - ProcessBuilder failing when calling a system command where Runtime exec works Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二进制文件? - Java, Runtime.exec or ProcessBuilder: how to know if the file is shell or binary? ProcessBuilder与Runtime.exec() - ProcessBuilder vs Runtime.exec() ProcessBuilder与Runtime.exec() - ProcessBuilder vs Runtime.exec() 使用ProcessBuilder / Runtime.exec()启动的外部进程在XP上失败,适用于Win 7 - External process launched with ProcessBuilder/Runtime.exec() fails on XP, works on Win 7 ProcessBuilder 和 Runtime.exec() 的区别 - Difference between ProcessBuilder and Runtime.exec() ProcessBuilder 和 RunTime.exec 没有运行我的代码 - ProcessBuilder and RunTime.exec not running my in code 订购 Runtime exec 和 ProcessBuilder.start? - Order a Runtime exec and a ProcessBuilder.start?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM