【问题标题】:How to run ffmpeg command in background from java如何从java在后台运行ffmpeg命令
【发布时间】:2011-04-14 01:06:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • ffmpeg 命令工作正常,在 php 中测试过

标签: java


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您是否在数组中传递参数?如果它工作了一段时间,你会给它所有预期的论据吗? (打印出来并检查)。这是我为您挖出的我的 ffmpeg 示例。

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

      【讨论】:

      • /usr/sites/ffmpeg -i livestream -r4 folderpth/image%d.jpeg
      • 您是否尝试将参数作为字符串列表传递?在您的原始问题中发布一些代码,向我们展示您拥有的内容。我上面的代码采用一个整数参数作为输入文件的时间并输出图像。
      • 这里是示例代码。 String cmd="/usr/sites/ffmpeg -i"+ livestream +" -r4 "+folderpth+"/image%d.jpeg"; try{ 进程 p = Runtime.getRuntime().exec(cmd); }捕捉{}
      • 用参数的字符串数组试试,而不仅仅是一个大字符串。我也遇到了一些问题,只使用字符串而不是字符串数组。
      • 字符串数组中的“in”和“out”参数是什么
      【解决方案4】:

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

      如果您的进程正在停止(即正在运行但只是不工作),那么我怀疑它被阻止等待您使用 stdout/stderr。您必须使用线程来执行此操作,以防止进程阻塞等待您使用其输出。详情请见this SO answer

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

      1. 产生一个新线程
      2. 在此线程中通过Process.exec 调用进程
      3. 使用stdout/stderr(都在单独的线程中),最后得到退出代码

      【讨论】:

      • 我也用线程测试过..但结果还是一样。如何将任务放到后台意味着如何使用“&”
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2012-07-08
        • 2017-10-29
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2020-11-23
        • 2015-05-08
        相关资源
        最近更新 更多