написать подпроцесс внутри основного процесса

1

Я пытаюсь реализовать видео в прямом эфире с малины pi cam. Я разработчик Java, мало осведомленный о Linux.

Я успешно выполнил команду raspivid для потокового видео в реальном времени на веб-странице, используя следующую команду;

raspivid -t 0 -w 960 -h 540 -fps 25 -b 500000 -vf -o - | ffmpeg -i - -vcodec copy -an -f flv -metadata streamName=myStream tcp://0.0.0.0:6666

Я пытаюсь добавить некоторые элементы управления при запуске видео в реальном времени, например, добавление контраста и яркости и т.д.

--contrast, -co Set image contrast (-100 to 100)
--brightness, -br Set image brightness (0 to 100)

но ему необходимо перезапустить полную команду raspivid, чтобы вступить в силу в Интернете, например, сначала убить процесс raspivid, добавить соответствующий элемент управления и снова перезапустить полную команду raspivid. Можно ли запускать отдельные команды для элементов управления raspivid? Я имею в виду разные команды raspivid для запуска потоковой передачи и разные, чтобы добавить контраст и яркость, не прерывая предыдущую команду. Если нет, то как мы можем это сделать?

Есть ли способ написать вспомогательный процесс в основном процессе, чтобы мы могли перезапустить подпроцесс, не затрагивая основной процесс?

заранее спасибо

  • 0
    Какое это имеет отношение к Java?
  • 0
    Я создаю приложение в Java, которое выполняет эти команды Raspberry Pi с использованием ProcessBuilder.
Показать ещё 5 комментариев
Теги:
raspberry-pi

3 ответа

0

Единственный способ сделать это - использовать имена FIFO

В вашем примере может быть что-то вроде этого:

$ mkfifo /tmp/FIFOVIDEO
$ raspivid -t 0 -w 960 -h 540 -fps 25 -b 500000 -vf -o /tmp/FIFOVIDEO &
$ ffmpeg -i /tmp/FIFOVIDEO -vcodec copy -an -f flv -metadata streamName=myStream tcp://0.0.0.0:6666

В этом случае вы можете остановить и запустить процесс номер 2 на короткие промежутки времени.

Имейте в виду, что у названного FIFO есть определенное количество буфера для заполнения, если оно заполняется, первый процесс, скорее всего, умрет.

0

Для принятия (дополнительных) внешних элементов управления приложение raspvid должно быть записано в такой логике. Более простой способ:

  • позволяет считывать параметры программы из файла
  • на некоторый сигнал, например SIGUSR2 - перечитать аргументы из вышеуказанного файла

В настоящее время он не разработан таким образом. Вот идея пауза/запуск программы на signa SIGUSR1, но повторное чтение ее аргументов времени исполнения. Поэтому вы не можете делать то, что хотите, простым способом.

Что вы действительно можете сделать:

Сначала - лучший способ:

  • raspvid чтобы разрешить вышеупомянутую функциональность. Он написан на C. Итак, нужно реализовать две подпрограммы:

    • один для чтения аргументов из файла
    • подпрограмма для обработки сигналов для SIGUSR2

Может быть, не очень сложно, но вы должны знать C и понять, как работает raspvid.

Во-вторых:

  • напишите обертку (в java, bash или любом языке программирования), что бы:
    • в некоторых интервалах (или на некотором сигнале) будет читать файл с аргументами
    • проверяет процессы для raspvid
    • если существует - убить его
    • и начать с новых аргументов из файла

Таким образом, основным циклом будет:

  • добавьте все необходимые (не только контрастные, но все) аргументы в определенный файл
  • отправьте сигнал SUGUSR1 на
    • raspvid процесс (в случае исправления респирации)
    • к сценарию обертки (во втором случае)
  • и это будет
    • перезапустить себя (в случае 1)
    • kill & restart (в случае 2)

Второе решение легко выполнимо - вы должны использовать google-сигнал "bash signal" или "сигналы ловушки bash"... Многие примеры уже есть в сети.

  • 0
    Спасибо за то, что я уже реализовал то же самое, я динамически устанавливаю все аргументы и запускаю команду kill & restart.
0

Этот поток может помочь, если все, что вы хотите сделать, это запустить команды в разных процессах. Однако я не уверен, что это решит проблему. Я также прочитал бы info doc для rapsivid, поскольку информационные документы, как правило, легче читать, чем справочные страницы. Просто введите info rapsivid в командной строке.

Как выполнить системные команды (linux/bsd) с помощью Java

  • 0
    Спасибо, что ответили, но то же самое касается информационных документов и справочных страниц. Я ничего не нашел в отношении расплющенных элементов управления для управления потоком видео с различными процессами.

Ещё вопросы

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