无法从命令行运行命令:ffmpeg无法转换文件

问题描述 投票:0回答:1

我正在尝试将音频从一种格式转换为:使用test.mpga库将test.ogg转换为ffmpeg。我有这个目录结构:

TestConvert
  ffmpeg
    ffmpeg.exe
    ffplay.exe
    ffprobe.exe
  audio
    test.mpga
  src
    main
      java
        somepackage
          utils
            Utils  <--- CmdTest run from here

这是我的代码:

class CmdTest {
        public static void main(String[] args) throws Exception {
            String path = "C:\\...\\TestConvert";
            Process p = Runtime.getRuntime().exec( path + "/ffmpeg/ffmpeg.exe -i " + path + "\\audio\\test.mpga " + path + "\\audio\\test.ogg");
            BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while (true) {
                line = r.readLine();
                if (line == null) { break; }
                System.out.println(line);
            }
        }
    }

但是,当我运行它时,它不打印任何内容,并以退出代码0退出。 test.ogg似乎没有出现在任何地方。我在做什么错?

我也想知道是否可以从资源文件夹中获取该文件?

EDIT:我尝试使用ProcessBuilder,但它仍然没有创建test.ogg文件并打印不可读的内容:

"C:\Program" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
 ProcessBuilder builder = new ProcessBuilder(
   "cmd.exe", "/c", path +
   "/ffmpeg/ffmpeg.exe -i " + path +
   "/audio/test.mpga" + path + "/audio/test.ogg");
 builder.redirectErrorStream(true);
 Process p = builder.start();
 BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
 String line;
 while (true) {
    line = r.readLine();
    if (line == null) { break; }
          System.out.println(line);
    }

同时将cdffmpeg.exe放在目录中,然后将test.mpga放入其中,然后运行它:

ProcessBuilder builder = new ProcessBuilder(
       "cmd.exe", "/c", "cd " + path + "\\ffmpeg &&" +
       "ffmpeg -i test.mpga test.ogg");

[潜在地,我希望它们都可以在罐子中工作,所以我真的很希望能够从资源中获取.exe和.mpga。

编辑

这也不起作用:

ProcessBuilder builder = new ProcessBuilder(
   path + "/ffmpeg/ffmpeg.exe",
   "ffmpeg -i " + path + "/audio/test.mpga " + path + "/audio/test.ogg");
java cmd ffmpeg
1个回答
1
投票

我尝试使用ProcessBuilder,但是它仍然没有创建test.ogg文件

好吧,您需要花更多时间阅读JavaDocs。

ProcessBuilderRuntime.exec都使您能够将命令和参数作为单独的元素进行传递。

这消除了命令(或参数)中“空格”的问题,您将不必逃避这些问题。

代替...

 ProcessBuilder builder = new ProcessBuilder(
   "cmd.exe", "/c", path +
   "/ffmpeg/ffmpeg.exe -i " + path +
   "/audio/test.mpga" + path + "/audio/test.ogg");

您可能会使用更多类似...

ProcessBuilder builder = new ProcessBuilder();
builder.command(path + "/ffmpeg/ffmpeg.exe",
        "-i",
        path + "/audio/test.mpga",             
        path + "/audio/test.ogg");
builder.redirectErrorStream(true);

您还可以使用builder.directory(new File(path));更改工作目录,这可能会使构建命令更容易

© www.soinside.com 2019 - 2024. All rights reserved.