【问题标题】:Java Runtime.getRuntime().exec() with quotesJava Runtime.getRuntime().exec() 带引号
【发布时间】:2010-07-06 20:59:15
【问题描述】:

我正在尝试通过 linux 上的 exec 调用运行 ffmpeg。但是我必须在命令中使用引号(ffmpeg 需要它)。我一直在查看有关 processbuilder 和 exec 的 java 文档以及有关 stackoverflow 的问题,但我似乎找不到解决方案。

我需要跑步

ffmpeg -i "rtmp://127.0.0.1/vod/sample start=1500 stop=24000" -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv

我需要在下面的参数字符串中插入引号。请注意,由于 processbuilder 解析和运行命令的方式的性质,简单地在反斜杠前面添加单引号或双引号是行不通的。

String argument = "ffmpeg -i rtmp://127.0.0.1/vod/"
                    + nextVideo.getFilename()
                    + " start=" + nextVideo.getStart()
                    + " stop=" + nextVideo.getStop()
                    + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv";

任何帮助将不胜感激。

【问题讨论】:

    标签: java linux exec runtime.exec


    【解决方案1】:

    做一个数组!

    exec 可以接受一个字符串数组,这些字符串用作命令和参数数组(与命令数组相反)

    类似这样的...

    String[] arguments = new String[] { "ffmpeg", 
    "-i", 
    "rtmp://127.0.0.1/vod/sample start=1500 stop=24000",
    "-re",
    ...
    };
    

    【讨论】:

    • 可以去掉字符“new String[]”;大括号会自动为你生成一个字符串数组。
    • 这不起作用,因为 rtmp://127.0.0.1/vod/sample start=xxx stop=xxx 必须有引号。将参数放在字符串数组中没有帮助。
    • 对不起,如果你把转义的引号没有帮助,如下所示:"\"rtmp://127.0.0.1/vod/sample start=1500 stop=24000\""
    • 我现在在 Windows 机器上,但明天我会让它工作并告诉你..
    • 与此同时,您始终可以通过将调用包装在 shell 脚本中来简化调用(需要 args $1、$2、$3)
    【解决方案2】:

    听起来您需要在参数字符串中转义引号。这很简单,只需使用前面的反斜杠即可。

    例如

    String containsQuote = "\"";
    

    这将评估为仅包含引号字符的字符串。

    或者在您的特定情况下:

    String argument = "ffmpeg -i \"rtmp://127.0.0.1/vod/"
              + nextVideo.getFilename()
              + " start=" + nextVideo.getStart()
              + " stop=" + nextVideo.getStop() + "\""
              + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv";
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2011-01-07
      相关资源
      最近更新 更多