web-dev-qa-db-ja.com

ProcessBuilderは、Runtime()。exec()が正常に機能している間、Macで「そのようなファイルまたはディレクトリはありません」と表示します。

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
_
32
Luuk D. Jansen

引数を個別のStringsとして指定する必要があります:

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

コンストラクターはStringvarargs、およびList<String>を受け入れます。

ProcessBuilderのドキュメント を参照してください。

58
Neet