Некоторые Java обрабатывают объекты, заканчивающиеся sh и закрывающиеся, но некоторые заканчивают sh и останавливаются - PullRequest
1 голос
/ 28 марта 2020

Моя программа использует 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% в диспетчере задач. Когда я принудительно завершаю программу и проверяю выходную папку, все фрагменты находятся там и не повреждены, поэтому я знаю, что он успешно завершился.

1 Ответ

1 голос
/ 28 марта 2020

Итак, я решил свою проблему. Я должен был прочитать Javado c для Process более тщательно, потому что он предупредил меня о проблеме там. Javado c предупреждает: «Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке или даже взаимной блокировке подпроцесса». ffmpeg много печатал на stdout, и я ничего не делал, чтобы справиться с этим. Вместо того, чтобы управлять им в Java, я решил добавить -hide_banner и -loglevel error к моей команде, чтобы ffmpeg ничего не выводил в stdout, если это не ошибка. В будущем я могу найти более комплексное решение.

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