Вопрос или проблема
Мой случай использования: У меня есть Raspberry Pi 3B+ с официальным модулем камеры Raspberry Pi Camera Module 3, который передает поток видео H.264, который я получаю на другой системе Ubuntu 22.04 без графического интерфейса (не Raspberry Pi) с использованием RTSP в моей локальной сети. Важно, чтобы этот видеопоток имел хорошее качество (я использую его в ZoneMinder, и мне удалось добиться достаточно хорошей работы, указав “rtsp://192.168.xxx.xxx:nnnn/streamname” в определении камеры ZM). Иногда я хочу смотреть этот поток напрямую с совершенно отдельного компьютера или телефона, но, похоже, это слишком много для Pi, так как качество видео иногда плохое, и это может повлиять на поток Zoneminder.
Моя первоначальная идея о том, как улучшить эту ситуацию: Я хотел бы, чтобы система Ubuntu с работающим Zoneminder (Ubuntu 22.04, но я не против обновить ее до 24.04, если это поможет – но я буду использовать только LTS версии) была единственным получателем RTSP потока с Pi, и частично предоставляла RTSP “выход” для Zoneminder на той же системе, но также предоставляла открытый порт, на котором она могла бы предоставить идентичную копию того же входящего RTSP потока любому другому системе, которая к ней подключится. Таким образом, не нагружая дополнительно Raspberry Pi, независимо от количества зрителей. Но у меня нет идей, как это осуществить. Я предполагаю, что система Ubuntu 22.04 должна действовать как сервер для реле видео.
Но я мог пропустить другой, лучший способ полного решения этой проблемы, и если это так, пожалуйста, укажите мне в правильном направлении.
Или, должен ли этот видеопоток для нескольких конечных устройств быть настолько легким для загрузки ЦП/ГП на Raspberry Pi, что он не должен иметь никаких проблем с передачей нескольких копий/версий одного и того же видеопотока на несколько конечных устройств (т.е. есть какая-то проблема с Raspberry, которую я не наблюдал только с активным потоком ZM)? Имейте в виду, что это RPi 3B+, с всего лишь 1 ГБ ОЗУ. (И он не подвергается терм throttling, и общая загрузка ЦП составляет около 25% на одном из четырех ядер, так что я предполагаю, что проблема заключается в GPU.) Кроме того, RPi подключен через Wifi, но система Ubuntu с работающим ZoneMinder имеет соединение 1 GbE, так что пропускная способность Wifi может быть ограничивающим фактором, если запускать несколько RTSP потоков с самого RPi.
Таким образом, если мои предположения/идеи правильные, мне нужно что-то на системе Ubuntu 22.04, чтобы принимать RTSP поток с Raspberry Pi и либо декодировать/перекодировать его для любой другой системы, которая его получает, либо, предпочтительно, пересылать поток без какого-либо декодирования/кодирования с целью уменьшить нагрузку на ЦП. Есть ли идеи, как это решить?
Что касается других вещей, которые я тестировал: Это не проблема нагрузки ЦП/%iowait
ни на RPi, ни на системе Ubuntu 22.04 с Zoneminder, как подтверждено htop
и iostat
. Это не проблема с пропускной способностью сети, как подтверждено bmon
/iw dev wlan0 link
. Это не термическое троттлирование. Видео не сохраняется на диск, так что это не проблема с дисковым вводом-выводом. Я не наблюдал явлений обмена ни на одной из систем, и, похоже, свободной оперативной памяти достаточно.
Ответ или решение
Ваш случай использования действительно представляет собой интересную задачу. Давайте детально рассмотрим, как можно реализовать буферизацию потока RTSP на системе Ubuntu, а затем переслать этот поток на одно или несколько локальных/удалённых клиентских устройств.
Шаги для реализации буферизации и ретрансляции RTSP в Ubuntu
-
Использование VLC для буферизации и пересылки потока:
VLC (VideoLAN Client) – это мощный медиаплеер, который также поддерживает функции потока. Вы можете использовать его для захвата входного RTSP-потока и последующей ретрансляции его на другие клиенты. Убедитесь, что вы установили VLC на вашей Ubuntu системе, используя следующую команду:sudo apt install vlc
Далее вам нужно будет выполнить команду для захвата и пересылки потока:
cvlc rtsp://192.168.xxx.xxx:nnnn/streamname --sout '#rtp{sdp=rtsp://:8554/streamname}' --loop
Здесь
8554
– это порт, на котором будет доступен поток для других клиентов, аstreamname
– это имя вашего потока. -
Настройка клиента для подключения к потоку:
После того как VLC настроен на ретрансляцию потока, клиенты могут подключаться к нему, используя адресrtsp://ваш_сервер:8554/streamname
. Это означает, что вы сможете получить доступ к потоку с любой машины, имеющей доступ к вашей сети. -
Снизу нагрузки на Raspberry Pi:
Поскольку вы упоминаете, что Raspberry Pi 3B+ может испытывать сложности с многими запросами на поток, важно убедиться, что он не обрабатывает этих запросов напрямую. Поскольку ваш основной сервер Ubuntu будет обрабатывать все запросы, вы по сути разгружаете Pi, позволяя ему только отправлять один поток. -
Альтернативные решения и рекомендации:
Если вы ищете более производительное решение, вы можете рассмотреть возможность использования программного обеспечения для потоковой передачи, такого как GStreamer. Это мощный инструмент для создания и обработки потокового медиа.Пример команды для GStreamer может быть следующим:
gst-launch-1.0 rtspsrc location=rtsp://192.168.xxx.xxx:nnnn/streamname ! decodebin ! x264enc ! rtph264pay ! udpsink host=ваш_клиент_адрес port=5000
Это позволит вам не только принимать поток, но и при необходимости изменять кодек или параметры потока.
-
Мониторинг и отладка сети:
Убедитесь, что ваша сеть может поддерживать потоковую передачу данных. Подключите свой Raspberry Pi с помощью Ethernet-кабеля вместо Wi-Fi для улучшения стабильности. Также проверьте использование полосы пропускания во время стриминга, чтобы исключить любые недостатки.
Заключение
Выбор подходящего подхода к буферизации и ретрансляции потока RTSP на Ubuntu зависит от ваших конкретных потребностей и инфраструктуры. Использование VLC или GStreamer является наиболее разумным решением для создания потока RTSP на Ubuntu, что позволит вам сократить нагрузку на Raspberry Pi и обеспечить доступ к видео с любого устройства в вашей сети.
Если возникнут дополнительные вопросы или потребность в конкретных примерах, не стесняйтесь обращаться за помощью.