LINUX.ORG.RU

Стример мультикаста на linux

 , ,


0

1

Есть задача собрать стенд для тестирования мультикаста, условный сервер должен пускать несколько потоков с разным качеством картинки и битрейтом. Нашел как сделать через ffmpeg и vlc, выбрал первый, получилось что-то вроде:

ffmpeg -stream_loop -1 -i <video> -c copy -f mpegts 'udp://<mcast_addr>:<port>'
и это работает, но хотелось бы автостарт и перезапуск потока при подении, где прочитать про sd-магию которая мне нужна для создания подобного юнита?

Ну и есть есть готовые решения для mcast-стендов (желательно с интерфейсом что-бы любой человек не знакомый с linux мог поменять/добавить потоки) то насоветуйте.

★★★★

Что-то типа:

[Unit]
Description=Multicast streaming service
Requires=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/mcastrc
ExecStart=/usr/bin/ffmpeg $MC_FFMPEG_OPTS -stream_loop -1 -i ${MC_INPUT} -c copy -f mpegts udp://${MC_ADDRESS}:${MC_PORT}
Restart=on-failure
# FFmpeg returns 255 when stopped by systemd
SuccessExitStatus=255

[Install]
WantedBy=multi-user.target

Настраивается через /etc/mcastrc:

# ffmpeg(1) input path
MC_INPUT=<путь к файлу>

# Multicast address
MC_ADDRESS=<адрес>

# Multicast port
MC_PORT=<порт>

# Other ffmpeg(1) options
MC_FFMPEG_OPTS=-v quiet
Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

Круто, а можно так-же но сразу несколько потоков одним юнитом запускать, или просто склепать десяток юнитов и не париться? Сейчас оно bash-портянкой стартует, если что.

Kolins ★★★★
() автор топика
Ответ на: комментарий от Kolins

а можно так-же но сразу несколько потоков одним юнитом запускать

Чем потоки отличаются?

Можно превратить юнит в шаблонный. Для этого нужно назвать его, например, так: mcast@.service – с содержимым:

[Unit]
Description=Multicast streaming service (%I)
Requires=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/mcast/%I
ExecStart=/usr/bin/ffmpeg $MC_FFMPEG_OPTS -stream_loop -1 -i ${MC_INPUT} -c copy -f mpegts udp://${MC_ADDRESS}:${MC_PORT}
Restart=on-failure
# FFmpeg returns 255 when stopped by systemd
SuccessExitStatus=255

[Install]
WantedBy=multi-user.target

Тогда использовать юнит можно так:

systemctl <start|enable|...> mcast@configfile.service

– и в качестве файла настройки будет использоваться /etc/mcast/configfile. Таких юнитов с разными именами файлов конфигурации можно одновременно запустить/включить/… сколько угодно.

Чтобы управлять ими одной командой, нужно копать в сторону .target.

Rootlexx ★★★★★
()
Ответ на: комментарий от Kolins

разные файлы на разные адреса транслируются

Ну тогда вариант выше с разными файлами конфигурации вполне подойдёт.

Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

Можно превратить юнит в шаблонный. Для этого нужно назвать его, например, так: mcast@.service – с содержимым:

Спасибо, похоже на то что нужно. пойду пробовать.

Kolins ★★★★
() автор топика
Ответ на: комментарий от Rootlexx

Работает, но если добавить неправильные ключи (от которых ffmpeg падает на старте), то systemd не ругается на это.

Kolins ★★★★
() автор топика
Ответ на: комментарий от Kolins

Работает, но если добавить неправильные ключи (от которых ffmpeg падает на старте), то systemd не ругается на это.

Ругается:

root@ffmpeg:~# cat /etc/mcast/test 
# ffmpeg(1) input path
MC_INPUT=/root/test.webm

# Multicast address
MC_ADDRESS=127.0.0.1

# Multicast port
MC_PORT=1234

# Other ffmpeg(1) options
MC_FFMPEG_OPTS=-v quiet

root@ffmpeg:~# systemctl start mcast@test.service
root@ffmpeg:~# systemctl -l --no-pager status mcast@test.service
● mcast@test.service - Multicast streaming service (test)
   Loaded: loaded (/etc/systemd/system/mcast@.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-09-16 17:53:28 MSK; 8s ago
 Main PID: 2296 (ffmpeg)
   CGroup: /system.slice/system-mcast.slice/mcast@test.service
           └─2296 /usr/bin/ffmpeg -v quiet -stream_loop -1 -i /root/test.webm -c copy -f mpegts udp://127.0.0.1:1234

Sep 16 17:53:28 ffmpeg systemd[1]: Started Multicast streaming service (test).
Sep 16 17:53:29 ffmpeg ffmpeg[2296]: Warning: using insecure memory!
root@ffmpeg:~# sed -Ei 's/^(MC_FFMPEG_OPTS=.*)/\1 -nonexistentoption/g' /etc/mcast/test 
root@ffmpeg:~# systemctl restart mcast@test.service
root@ffmpeg:~# systemctl -l --no-pager status mcast@test.service
● mcast@test.service - Multicast streaming service (test)
   Loaded: loaded (/etc/systemd/system/mcast@.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2020-09-16 17:55:47 MSK; 4s ago
  Process: 2305 ExecStart=/usr/bin/ffmpeg $MC_FFMPEG_OPTS -stream_loop -1 -i ${MC_INPUT} -c copy -f mpegts udp://${MC_ADDRESS}:${MC_PORT} (code=exited, status=1/FAILURE)
 Main PID: 2305 (code=exited, status=1/FAILURE)

Sep 16 17:55:47 ffmpeg systemd[1]: mcast@test.service: Service RestartSec=100ms expired, scheduling restart.
Sep 16 17:55:47 ffmpeg systemd[1]: mcast@test.service: Scheduled restart job, restart counter is at 5.
Sep 16 17:55:47 ffmpeg systemd[1]: Stopped Multicast streaming service (test).
Sep 16 17:55:47 ffmpeg systemd[1]: mcast@test.service: Start request repeated too quickly.
Sep 16 17:55:47 ffmpeg systemd[1]: mcast@test.service: Failed with result 'exit-code'.
Sep 16 17:55:47 ffmpeg systemd[1]: Failed to start Multicast streaming service (test).
root@ffmpeg:~# cat /etc/mcast/test 
# ffmpeg(1) input path
MC_INPUT=/root/test.webm

# Multicast address
MC_ADDRESS=127.0.0.1

# Multicast port
MC_PORT=1234

# Other ffmpeg(1) options
MC_FFMPEG_OPTS=-v quiet -nonexistentoption

root@ffmpeg:~# 

Всё работает как ожидается.

Или вы имеете в виду, что не ругается сразу при выполнении команды start? – ну тогда это как раз ожидаемо, поскольку запускается обычный не форкающийся процесс, поэтому тип сервиса – simple (man systemd.service), для которого невозможно определить успешность запуска вне рамок чисто запуска процесса.

Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

Или вы имеете в виду, что не ругается сразу при выполнении команды start?

ага

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

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

спасибо за помощь

Kolins ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.