0

私はLinuxが初めてなので、事前に申し訳ありません。OS「Ubuntu 12-04-AutogenByAWSMP」

サーブレットから 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/";

私はコードがきれいではないことを知っています(問題を理解しようとしている間、足を引きずっています)。私はたくさんのグーグルとたくさんの読書をしています(このサイトの多くを含む). ffprobe の前に /bin/bash -c を入れるなど、私が試したことをコメントアウトしたことがわかります。また、現在、LIBPATH を、プロンプト (@ ストローをつかむ) で機能する PATH と同じになるように設定しています。

何かご意見は?前もって感謝します。

4

1 に答える 1

0

一時的に libstdc++ を移動してから、コードを再度実行できますか?

$ mkdir /opt/bitnami/backup.libstdc++
$ mv /opt/bitnami/common/lib/libstdc++.*  /opt/bitnami/backup.libstdc++
于 2013-06-10T14:29:43.990 に答える