【问题标题】:Running ffprobe from java ProcessBuilder is failing从 java ProcessBuilder 运行 ffprobe 失败
【发布时间】:2013-06-02 00:17:36
【问题描述】:

抱歉,我是 linux 新手。操作系统“Ubuntu 12-04-AutogenByAWSMP”

我希望从我的 servlet 启动 ffprobe 以了解有关电影文件的信息。

从命令行可以正常工作。在 java 中,这总是失败:(来自错误流)

/usr/bin/ffprobe:/opt/bitnami/common/lib/libstdc++.so.6:未找到版本“GLIBCXX_3.4.11”(/usr/lib/x86_64-linux-gnu/libjack.so.0 需要) /usr/bin/ffprobe: /opt/bitnami/common/lib/libstdc++.so.6: 找不到版本“GLIBCXX_3.4.9”(/usr/lib/x86_64-linux-gnu/libjack.so.0 需要) /usr/bin/ffprobe:/opt/bitnami/common/lib/libstdc++.so.6:未找到版本“GLIBCXX_3.4.15”(/usr/lib/x86_64-linux-gnu/libjack.so.0 需要) /usr/bin/ffprobe:/opt/bitnami/common/lib/libstdc++.so.6:未找到版本“GLIBCXX_3.4.9”(/usr/lib/libopencv_core.so.2.3 需要)

我的java代码是:

private static String PATH_FOR_ENV = "=/opt/bitnami/sqlite/bin:/opt/bitnami/java/bin:/opt/bitnami/php/bin:/opt/bitnami/mysql/bin:/opt/bitnami/apache2/bin:/opt/bitnami/common/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games";

.....

     final ProcessBuilder builder = new ProcessBuilder();

            builder.redirectErrorStream(true);
            List<String> params = createCommand("ffprobe");
            this.addFFProbeArgs(params);
            params.add(src.getAbsolutePath());
            ProcessBuilder command = builder.command(params);
            if(isLinux())
                 command.environment().put("LIBPATH", PATH_FOR_ENV);
            Process p= command.start();

            InputStream input = p.getInputStream();
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int read;
            while ((read = input.read(bytes)) != -1)
            {
                bos.write(bytes, 0, read);
            }
            input.close();
            p.waitFor();
            String info = new String(bos.toByteArray());
            System.out.println(info);

其他助手

private void addFFProbeArgs(List<String> pParams)
    {
        pParams.add("-v");
        pParams.add("quiet");
        pParams.add("-show_streams");
        pParams.add("-show_format");
        pParams.add("json");
    }
private List<String> createCommand(String pCommand)
    {
        List<String> commandParams = new ArrayList<String>();
        if(isLinux())
        {
            //commandParams.add("/bin/bash");
            //commandParams.add("-c");
        }
        commandParams.add(ROOT_DIR+ pCommand);
        return commandParams;
    }

private static String       ROOT_DIR = "/usr/bin/";

我知道代码不漂亮(在我尝试找出问题时一直一瘸一拐)。我做了很多谷歌搜索和大量阅读(包括这个网站上的很多)。你可以看到我尝试过的被我注释掉的东西,例如把 /bin/bash -c 放在 ffprobe 前面。此外,我目前正在将 LIBPATH 设置为与在提示符下工作的 PATH 相同(抓住@稻草)。

有什么想法吗?提前致谢。

【问题讨论】:

    标签: java processbuilder ffprobe


    【解决方案1】:

    您可以尝试临时移动 libstdc++,然后再次执行您的代码吗?

    $ mkdir /opt/bitnami/backup.libstdc++
    $ mv /opt/bitnami/common/lib/libstdc++.*  /opt/bitnami/backup.libstdc++
    

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多