Всем привет!
Стоит такая задача: транслировать с максимальной стабильностью около 100-150 ip-камер с помощью сервера на основе nginx-rtmp и gstreamer.
----------------
Предыстория, или почему gstreamer, а не ffmpeg:
1. Сейчас это все реализовано с помощью связки momentvideo + все тот же nginx-rtmp (у самого момента кривой hls). Но разраб забил на momentvideo и укатил в далекие США, поэтому сборка только 2014-го года со старой и сравнительно неудачной версией gstreamer.
2. ffmpeg по моим наблюдениям гораздо менее стабилен с теми камерами, которые уже стоят.
3. Пайплайны таки нужны для некоторых задач, и я уже к ним привык благодаря моменту.
4. текущая связка работает, но не так стабильно, как хотелось бы (старый gstreamer часто теряет поток, nginx пришлось криво патчить, чтобы он понял кривой размер чанка, указанный разрабом momentvideo и т.д.)
----------------
Сейчас есть мысль сделать что-то по типу:
#!/bin/sh
while true; do
gst-launch-1.0 \
rtspsrc location=rtsp://my.ip.cam/ protocols=tcp ! rtph264depay \
! h264parse \
! queue \
! flvmux \
! rtmpsink location="rtmp://my.server.ip/live/test"
done
-----------------
Проблемы/вопроса два:
1. как-то страшновато запускать в таком режиме 150 процессов. В моменте сейчас это реализовано потоками, и все работает даже при большом количестве камер. Возможно как-то можно с минимумом программирования на Си++ сделать эти 150 пайплайнов одним процессом? (Я очень давно ничего не писал на нем - последний опыт общения с языками со строгой типизацией был в 2010 году, и это была джава).
2. Если входящий поток падает по той или иной причине, gstreamer довольно долго (до минуты) думает, прежде, чем завершиться (между сообщением PAUSED и READY):
Got EOS from element "pipeline0".
Execution ended after 0:01:20.895625106
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Можно ли как-то указать, что нужно завершаться немедленно, если в пайплайне произошел EOS?
Ну и для страховки от зависания:
1. как можно указать, что нужно завершиться, если в течение N секунд поток не получил никаких данных?
2. как можно ограничить время жизни потока (к примеру, 1 часом), чтобы исключить подтекание gstreamer'а (моментвидео, к примеру ну очень хорошо течет при большом количестве потоков)?
Заранее всем признателен за ответы/советы.
PS: поставить flussonic/wowza/nimble и не парится - не предлагать