Не удается запустить команду из командной строки: ffmpeg не конвертирует файл - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь преобразовать звук из одного формата в другой: 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, кажется, нигде не появляется. Что я делаю не так?

Мне также было интересно, можно ли взять этот файл из папки ресурсов?

РЕДАКТИРОВАТЬ : я пытался использовать 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);
    }

В то же время делает его cd в каталоге с ffmpeg.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");

1 Ответ

2 голосов
/ 29 января 2020

Я пытался использовать ProcessBuilder, но он все еще не создает файл test.ogg

Хорошо, вам нужно потратить немного больше времени на чтение JavaDocs чуть более подробно .

И ProcessBuilder, и Runtime.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)); для изменения рабочего каталога, что может упростить сборку команды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...