java processbuilder ffmpeg 管道

java processbuilder ffmpeg pipe

我尝试 运行 ffmpeg 输出 java。这是我的代码:

String[] temp = {"ffmpeg\ffmpeg.exe","-i","input_track.ac3","-threads","0","-af","volume=volume="0.0"dB","-acodec","pcm_s32le","-ac","6","-ar","48000","-f","wav","-","|","ffmpeg\fdkaac","--ignorelength","-m","1","-o","ouput_track.aac","-"};

ProcessBuilder pb = new ProcessBuilder(temp);
Process p = pb.start();
int ev = 0;
if (p.waitFor() != 0)
{
   ev = p.exitValue();
}

我在 windows cmd 尝试命令,这里的“|”有问题在 ffmpeg 命令行。

也许有人说我犯规了?

此致

|是一个 shell 竖线字符,在 java 中你必须 运行 这个命令在 shall (bash -c "the whole commandline | goes here") 中,或者你'将必须 运行 两个进程(| 之前的一个和之后的一个),其中第一个的标准输出写入第二个的标准输入。为此,您通常会使用 redirectOutput(Redirect.PIPE) and redirectInput(Redirect.PIPE).

这个问题类似于How to make pipes work with Runtime.exec()? ...除了它是针对Windows。

问题本质上是一样的:exec 方法不理解 shell 语法,例如管道、输入或输出方向等。解决方案本质上也是相同的:执行适当的 shell 并让它处理 shell 语法。

在这种情况下,尝试这样的事情:

String[] temp = new String[] {
    "cmd", "/c",
    "ffmpeg\ffmpeg.exe -i input_track.ac3 -threads 0 " + 
    "-af volume=volume=\"0.0\"dB -acodec pcm_s32le -ac 6 " +
    "-ar 48000 -f wav - | " +
    "ffmpeg\fdkaac --ignorelength -m 1 -o ouput_track.aac -"
};

请注意,实际命令是单个字符串。 (0.0 周围的引号看起来有点奇怪,但这就是你的问题。)