gpt4 book ai didi

Java用(管道) "... -f nut - | ffmpeg -i - ..."执行ffmpeg命令只是挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:29 29 4
gpt4 key购买 nike

我无法让它运行,因为 java 只是在等待 ffmpeg。但是 ffmpeg 不提供输入,也不提供错误流。它只是运行,但什么也不做。

"System.out.println("command:.."insert into bash 的输出按预期正常运行。因此 ffmpeg 语法没有任何问题。

这是代码。

package mypackage;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.imageio.ImageIO;

/**
*
* @author test
*/
public class ffmpeg_hang {

/**
* @param args the command line arguments
*/
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[] ffmpeg_pipe = new String[]{
FFMPEG_PATH + "ffmpeg_4.1.1",
"-ss",(i+""),"-t", "4",
"-i", INPUT_FILE,
"-ac", "1", "-acodec", "pcm_s16le", "-ar", "16000",
"-f","nut","-","|",
FFMPEG_PATH + "ffmpeg_4.1.1",
"-i","-",
"-lavfi", "showspectrumpic=s=128x75:legend=disabled:saturation=0:stop=8000",
"-f","image2pipe","pipe:1"};

System.out.println("command: "+String.join(" ", ffmpeg_pipe));

Process p;
//ffmpe wav->pipe->spectrogra->pipe->java
p = Runtime.getRuntime().exec(ffmpeg_pipe);


StringBuilder Boxbuffer = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";

while ((line = reader.readLine()) != null) {
Boxbuffer.append(line);
}


System.out.println("ffmpeg errors->> "+Boxbuffer.toString());
p.waitFor();


BufferedImage image = ImageIO.read(p.getInputStream());
//do stuff with image
}

}

}

最佳答案

当以这种方式直接在命令中传递时,管道将不会被解释,它只是命令开头第一个 ffmpeg 的另一个参数。考虑使用 /bin/sh -c "command1 | command2" 作为包装器(假设非 Windows 操作系统...)。

考虑将 -nostdin 添加到第一个 ffmpeg 命令以避免 numberissues使用 ffmpeg 尝试在您不期望它时读取标准输入(显然不是在第二个中)。

考虑使用 String.format用变量构建复杂的字符串。

考虑使用 ProcessBuilder 来更轻松地创建流程。在这里,我将错误重定向到您的 Java 进程 stderr,这样您就可以在不使用线程的情况下读取您的子进程的标准输出。 See alternatives

所以这里有一个建议:

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());
// ...
}
}

关于Java用(管道) "... -f nut - | ffmpeg -i - ..."执行ffmpeg命令只是挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com