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
周围的引号看起来有点奇怪,但这就是你的问题。)
我尝试 运行 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
周围的引号看起来有点奇怪,但这就是你的问题。)