Получить и проанализировать поток вывода из Apache exec commons

1

То, что я пытаюсь сделать, это захватить поток IP Cam с помощью avconv. Мне удалось получить этот поток и сохранить его в файле, используя библиотеку apache exec commons для Java, например:

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
String str = avconv_command; 
CommandLine commandLine = CommandLine.parse(str);
ExecuteWatchdog watchdog = new ExecuteWatchdog(1000000);
Executor executor = new DefaultExecutor();
executor.setWatchdog(watchdog);
executor.execute(commandLine, resultHandler);

При этом avconv начинает захватывать потоковое вещание и сохраняет его в файл, а на консоли я вижу, как работает avconv и выводится процесс. Каждая строка этого вывода показывает длительность видео, которое в данный момент записывается, битрейт и т.д. Мне нужно захватить этот вывод и обработать его во время его работы. Есть предположения?

Я прочитал много сообщений:

Вывод процесса из apache-commons exec

Как я могу захватить вывод команды как String с Commons Exec?

Но все они прочитали вывод, когда процесс завершился, и мне нужно прочитать его во время его работы.

  • 0
    Разобрался .. ответ ниже
Теги:
apache-commons
apache-commons-exec

1 ответ

1

Выяснилось, что:

ByteArrayOutputStream os = new ByteArrayOutputStream();
PumpStreamHandler ps = new PumpStreamHandler(os);
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
String str = avconv_command; 
CommandLine commandLine = CommandLine.parse(str);
ExecuteWatchdog watchdog = new ExecuteWatchdog(1000000);
Executor executor = new DefaultExecutor();
executor.setWatchdog(watchdog);
executor.setStreamHandler(ps);
executor.execute(commandLine, resultHandler);
Reader reader = new InputStreamReader(new ByteArrayInputStream(os.toByteArray()));
BufferedReader r = new BufferedReader(reader);
String tmp = null;
while ((tmp = r.readLine()) != null) 
{
     //Do something with tmp line
}

Итак, я изменил вывод на ByteArrayOutputStream, а затем прочитал этот вывод. Этот блок должен находиться внутри цикла, поэтому массив байтов может обновлять содержимое, которое было сгенерировано из результата процесса

Ещё вопросы

Сообщество Overcoder
Наверх
Меню