gpt4 book ai didi

java - 如何设置 FFmpeg 在完成工作后向 java 代码发送信号?

转载 作者:行者123 更新时间:2023-12-01 09:46:24 26 4
gpt4 key购买 nike

我有一个java servlet,它等待http请求,当它到达时,它调用FFmpeg来混合两个视频。当 FFmpeg 完成其工作时,Java 代码需要将混合视频发送回请求者。如何设置 FFmpeg 在混合视频准备好时通知 java servlet?我的代码在当前形状中开始发送视频,而 FFmpeg 尚未完全完成。

我可以使用 thread.sleep() 或类似的方法,但由于我们需要测量研究工作的处理时间,所以我不能使用它。

如果您能在这方面帮助我,我将不胜感激。这是代码的一部分:

String videoId=req.getParameter("id");         
String ad= "/var/Videos/ads/angrybirds-adv.mp4";
String url="http://"+RequesterIP+"/"+videoId;
System.out.println("url: "+url);
String output= new SimpleDateFormat("yyyyMMddhhmm'.mp4'").format(new Date());
String videoPath = "/var/Videos/"+output;
List<String> cmds = new ArrayList<>();
cmds.add("ffmpeg");
cmds.add("-i");
cmds.add(url);
cmds.add("-i");
cmds.add(ad);
cmds.add("-filter_complex");
cmds.add("[0:v][1:v] overlay");
cmds.add(videoPath);
ProcessBuilder pb = new ProcessBuilder(cmds);
Process p = pb.start();

/** Terminal **/
final InputStream inStream = p.getErrorStream();
new Thread(new Runnable() {
public void run() {
InputStreamReader reader = new InputStreamReader(inStream);
Scanner scan = new Scanner(reader);
while (scan.hasNextLine()) {
System.out.println(scan.nextLine());
}
}
}).start();

// send the mixed video to the requester
File downloadFile = new File(videoPath);
...

更多详情:广告视频是与 FFmpeg 位于同一台计算机中的覆盖视频,原始视频位于请求者计算机中的公共(public)文件夹中,可以使用以下 url 进行访问:http://requester-IP/videoId

最佳答案

您不是等待进程完成,您应该使用 Process#waitFor() 来暂停线程,直到 ffmpeg 完成。

关于java - 如何设置 FFmpeg 在完成工作后向 java 代码发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981413/

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