Моя программа использует ProcessBuilder
для различных вызовов ffmpeg. Моя проблема в том, что с некоторыми командами я могу создать Process
, запустить его, и когда это будет сделано, он завершит / выйдет / закроется сам, и программа завершится, тогда как другие команды будут выполнены и создадут законченный вывод (в моем на случай, если он завершит sh кодирование файла без каких-либо повреждений или чего-либо еще в конце видео), но не закроется, в какой момент мне нужно принудительно завершить программу. Я проверил команды ffmpeg, которые я запускаю в Windows Командная строка, и все они работают нормально, без необходимости ввода данных пользователем или чего-либо еще. Я покажу несколько примеров команд, которые работают и не работают, но в конечном итоге мне нужен способ объяснить, почему определенные Process
работают и не работают. Возможно, вам даже не нужно читать оставшуюся часть этого поста, если вы знаете внутреннюю работу класса Process
лучше, чем я.
Как я создаю свои процессы:
ProcessBuilder pb = new ProcessBuilder(commandGoesHere);
Process p = pb.start();
p.waitFor();
Работает: ffmpeg -i test.y4m -f segment -segment_times timecodeList .temp/sgmnt_%d.y4m
Эта команда берет y4m (формат необработанного видео / большой размер файла / 1,7 ГБ для 53 с видео в формате 720p) и разделяет его на куски.
Не работает t работает (иногда): ffmpeg -i chunkname.y4m outputName.mkv
Эта команда берет фрагментированное видео и кодирует его как h.264 / AV C видео. Когда я создаю процесс с помощью этой команды, он работает, только если порция мала, в этом случае Process
запустится, выполнит свою работу и закроется.
Не работает никогда: ffmpeg -i test.mkv -c:v copy -f segment -segment_times timecodeList .temp/sgmnt_%d.mkv
Эта команда принимает и h.264 / AV C вводит видео и разрезает его на куски, но это не завершает / не завершает / закрывает, когда это сделано. Я вынужден завершить программу, что я делаю после того, как увидел, что загрузка процессора Process
снизилась до 0% в диспетчере задач. Когда я принудительно завершаю программу и проверяю выходную папку, все фрагменты находятся там и не повреждены, поэтому я знаю, что он успешно завершился.