Я пытаюсь реализовать видео в прямом эфире с малины 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 для запуска потоковой передачи и разные, чтобы добавить контраст и яркость, не прерывая предыдущую команду. Если нет, то как мы можем это сделать?
Есть ли способ написать вспомогательный процесс в основном процессе, чтобы мы могли перезапустить подпроцесс, не затрагивая основной процесс?
заранее спасибо
Единственный способ сделать это - использовать имена 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 есть определенное количество буфера для заполнения, если оно заполняется, первый процесс, скорее всего, умрет.
Для принятия (дополнительных) внешних элементов управления приложение raspvid
должно быть записано в такой логике. Более простой способ:
SIGUSR2
- перечитать аргументы из вышеуказанного файла В настоящее время он не разработан таким образом. Вот идея пауза/запуск программы на signa SIGUSR1
, но повторное чтение ее аргументов времени исполнения. Поэтому вы не можете делать то, что хотите, простым способом.
Что вы действительно можете сделать:
Сначала - лучший способ:
raspvid
чтобы разрешить вышеупомянутую функциональность. Он написан на C. Итак, нужно реализовать две подпрограммы:
SIGUSR2
Может быть, не очень сложно, но вы должны знать C
и понять, как работает raspvid
.
Во-вторых:
raspvid
Таким образом, основным циклом будет:
Второе решение легко выполнимо - вы должны использовать google-сигнал "bash signal" или "сигналы ловушки bash"... Многие примеры уже есть в сети.
Этот поток может помочь, если все, что вы хотите сделать, это запустить команды в разных процессах. Однако я не уверен, что это решит проблему. Я также прочитал бы info doc для rapsivid, поскольку информационные документы, как правило, легче читать, чем справочные страницы. Просто введите info rapsivid в командной строке.