Попытка обернуть простую однострочную команду в Java ProcessBuilder:
yes | ffmpeg -i /Users/ME/My Stuff/VTS_01_4.VOB -c copy VTS_01_4.VOB.m4v
Я разбил проблемы на 3 части, по которым документы не очень понятны.
1: пробелы в аргументах могут быть плохими.
Я думаю, что ProcessBuilder.command должен их обрабатывать: если вы разбиваете команду на логические куски, она будет выходить внутри каждого блока.
val command = arrayOf("yes", "|", "ffmpeg", "-i", inputPathString, "-c", "copy", outputPathString)
val process = ProcessBuilder()
.redirectErrorStream(true)
.command(*command)
.directory(workingDir)
.start()!!
2: блокировка на вводе / выводе плохая
Если вы попытаетесь получить весь вывод с помощью process.inputStream.bufferedReader().readLines()
, он не скажет вам, зависнет ли он, или если он ожидает ввода в середине. Однако, если вы попытаетесь получить вывод в том виде, в котором он был сгенерирован, он может застрять в ожидании строки. Уместно ли иметь блокировку на process.inputStream.bufferedReader().readLine()
для получения каждой строки?
3: Трубы (yes |
) плохие.
Не знаю, как решить эту проблему.