作者:鹰击长空1943 | 来源:互联网 | 2022-11-07 16:10
1> Hugues M...:
当以这种方式直接传递给命令时,不会解释管道,它只是ffmpeg
命令开头第一个参数的另一个参数。考虑/bin/sh -c "command1 | command2"
用作包装器(假设使用非Windows操作系统...)。
考虑加入-nostdin
到第一ffmpeg
命令,以避免一个数量的问题与ffmpeg的尝试读取标准输入,当你不是很期待(而不是在第二个明显的)。
考虑使用String.format
构建带有变量的复杂字符串。
考虑使用ProcessBuilder
来简化流程创建。在这里,我将重定向错误,使它们最终到达您的Java进程stderr,因此您可以在不使用线程的情况下读取子进程的stdout。查看替代品
所以这是一个建议:
public static void main(String[] args) throws IOException, InterruptedException {
String INPUT_FILE = "/path/to/media";
String FFMPEG_PATH = "/path/to/ffmpegFolder";
for (int i = 0; (i + 4) <40; i += 4) {
String command1 = String.format(
"%s/ffmpeg_4.1.1 -nostdin -ss %d -t 4 -i '%s' -ac 1 -acodec pcm_s16le -ar 16000 -f nut -",
FFMPEG_PATH, i, INPUT_FILE);
String command2 = String.format(
"%s/ffmpeg_4.1.1 -i - -lavfi showspectrumpic=s=128x75:legend=disabled:saturation=0:stop=8000",
FFMPEG_PATH);
Process process = new ProcessBuilder("sh", "-c", command1 + " | " + command2)
.redirectError(ProcessBuilder.Redirect.INHERIT)
.start();
BufferedImage image = ImageIO.read(process.getInputStream());
// ...
}
}