如何在java后台运行ffmpeg命令

时间:2010-09-18 08:37:22

标签: java

我正在从java Runtime.getRuntime()。exec运行一个ffmpeg命令。 ffmpeg命令基本上从实时流中剪切图像。 实际上,当我没有&运行此命令时然后它可以正常工作五分钟后,它会停止切割图像。

但是当我使用“&”时在ffmpeg命令中,它根本不起作用。

直播中没有问题,因为我从linux运行这个ffmpeg命令时工作正常。

我的主要问题是如何在java的后台运行ffmpeg命令。

5 个答案:

答案 0 :(得分:3)

'&'是一个 shell 指令,用于将任务放入后台。从Process.exec()运行不涉及shell。

如果您的进程停止(即运行但只是不工作),那么我怀疑它被阻止等待您使用stdout / stderr。您必须使用线程来防止进程阻塞等待您使用其输出。有关详细信息,请参阅this SO answer

要在后台运行它(例如,当您的Java进程执行其他操作时),您需要:

  1. 产生一个新线程
  2. 通过此帖子中的Process.exec调用该流程
  3. 使用stdout / stderr(两者都在不同的线程中),最后得到退出代码

答案 1 :(得分:1)

我知道您在Java中您的命令行问题寻求帮助,但您可能对其他解决方案感兴趣。

也许你可以尝试一下这个库: http://code.google.com/p/jjmpeg/

这是ffmpeg的包装器。 也许你可以尝试创建一个java线程并运行你的命令。

答案 2 :(得分:0)

你写的它在分钟后停止工作。您是否检查了退出代码(Process.exitValue())。另外,您是否检查了外部进程的输出流和错误流?

答案 3 :(得分:0)

您是否在数组中传递参数?如果它有效一段时间你是否给出了所有预期的参数? (打印出来并检查)。这是我为你挖出的ffmpeg的一个例子。

String[] ffmpeg = new String[] {"ffmpeg", "-ss", Integer.toString(seconds),"-i", in, "-f", "image2", "-vframes", "1", out};
Process p = Runtime.getRuntime().exec(ffmpeg);

答案 4 :(得分:0)

String livestream = "/Users/videos/video_10/video_1.mp4";

String folderpth = "/Users/videos/video_10/photos";

String cmd="/opt/local/bin/ffmpeg -i "+ livestream +" -r 10 "+folderpth+"/image%d.jpeg"; 

Process p = Runtime.getRuntime().exec(cmd);

视频是10秒。很长,它在照片文件夹中创建了100个jpeg。您必须提供文件夹的绝对路径。

还要在终端中找到ffmpeg二进制使用which ffmpeg的路径。我是/opt/local/bin/ffmpeg