- Вопрос или проблема
- Ответ или решение
- Шаг 1: Установка необходимых программ
- Установка ffmpeg:
- Установка gstreamer и необходимых плагинов:
- Шаг 2: Настройка потоковой передачи видео с камеры
- Использование ffmpeg
- Использование gstreamer
- Шаг 3: Подключение клиента к потокам
- С помощью ffplay:
- С помощью gstreamer:
- Шаг 4: Оптимизация задержки
- Заключение
Вопрос или проблема
Я пытаюсь создать идеальную мобильную веб-камеру, соответствующую моим потребностям, с помощью RPI и модуля камеры, которые у меня уже есть. Я использую Arch как на RPI, так и на ноутбуке, который собираюсь использовать в качестве “клиента”. Камера работает, и я могу передавать её данные из raspivid
куда-то, а также я могу подключаться по ssh.
Теперь я пытаюсь наладить передачу через локальную сеть. В идеале, я бы запустил “серверный” скрипт на RPI и смог бы подключать столько клиентов, сколько захочу, до тех пор, пока не решу закрыть сервер снова. И, в идеале, задержка от наличия отдельного устройства и беспроводной передачи была бы практически незаметной, так что мне не пришлось бы компенсировать и пытаться синхронизировать видео и аудио. Из того, что я прочитал, использование VLC — это не вариант. Также в идеале “клиент” должен сделать поток доступным как /dev/video1
или что-то подобное — хотя на данный момент я просто хочу как-то запустить это в OBS.
До сих пор я пытался следовать нескольким урокам, особенно с использованием netcat
, но процесс сразу останавливался или останавливался, как только происходило отключение, поскольку я не мог воспроизвести поток на клиенте.
Есть ли какие-либо рекомендации о том, где искать или как организовать это? Я думал о том, чтобы использовать что-то вроде медиа-сервера для динамического подключения (отключения) клиентов, но это должно быть очень легковесным.
Если вы хотите транслировать видео, используйте протокол, предназначенный для потокового видео. То есть, используйте UDP и multicast, чтобы подключить столько клиентов, сколько захотите. Потому что с TCP и unicast это остановится, как только вы отключитесь, как вы уже выяснили.
Существуют такие протоколы, например, RTSP, и есть реализации серверов, такие как icecast. Это не “супер легковесно”, но должно нормально работать на RaspPi.
И нет, вы не хотите делать поток доступным как /dev/video1
. Вместо этого вам следует использовать клиент, который правильно подключится к Multicast группе, а затем просто прочитает поток из сети.
Я не совсем уверен, что вы прочитали о VLC и почему это не вариант, но VLC (и большинство других видеоплееров) как клиент для RTSP потока должен работать без проблем, и не должно быть проблем с синхронизацией видео и аудио, если они транслируются синхронно (что может быть проблемой в зависимости от того, как оборудование подключено к RaspPi, но вы не упоминали ничего о вашем аудиоисточнике изначально).
Правка
Если вы настаиваете на минимализме, вы также можете использовать ffmpeg
, чтобы транслировать разными способами, но вам потребуется немного времени, чтобы понять задействованные протоколы, их отличия и параметры командной строки, которые вам нужны для них.
Правка
Хорошо, я посмотрел видео (по крайней мере, начало с VLC и задержки, мне не очень нравится смотреть видео).
Разумеется, будут большие задержки, если вы используете какой-либо достойный метод кодирования — для эффективного кодирования потребуется довольно много кадров (и затем потребуется такое же количество кадров для декодирования). Кроме того, он будет много буферизировать, чтобы ничего не потерять.
Для забавы я попробовал ffmpeg
с RTP на мультикассной группе, и я также получил большую задержку (порядка 1-2 секунд с H264, плюс задержка, добавляемая ffplay
). Снижение задержки — это отдельная наука и потребует много манипуляций с параметрами (и изучения их). Но наличие задержки не является признаком того, что что-то не так, наоборот.
Таким образом, если у вас есть абсолютные требования к низкой задержке, вам придется поступиться компрессией, размером изображения, качеством кодирования и пропускной способностью. Если ничего не помогает, уберите этап кодирования.
Ответ или решение
Для того чтобы настроить потоковую передачу видео с камеры Raspberry Pi (RPI) на локальную сеть, вам нужно использовать протоколы, созданные для потоковой передачи видео, такие как RTP или RTSP. Это позволит вам подключать множество клиентов без рисков, связанных с отключением индивидуальных подключений, которые вы столкнулись с использованием TCP.
Вот план, как реализовать вашу задачу:
Шаг 1: Установка необходимых программ
Убедитесь, что у вас установлены ffmpeg
, gstreamer
, или любой легковесный медиасервер для обработки потокового видео. Эти инструменты предоставляют гибкие и мощные возможности для потоковой передачи.
Установка ffmpeg:
sudo pacman -S ffmpeg
Установка gstreamer и необходимых плагинов:
sudo pacman -S gstreamer gstreamer-good gstreamer-bad gstreamer-ugly gst-plugins-base
Шаг 2: Настройка потоковой передачи видео с камеры
Использование ffmpeg
Вы можете использовать ffmpeg для передачи видео с камеры на локальную сеть по протоколу RTP:
raspivid -o - -t 0 -n | ffmpeg -f h264 -i pipe:0 -c:v copy -f rtp rtp://<адрес_IP_вашего_компьютера>:5004
Где <адрес_IP_вашего_компьютера>
– это IP-адрес вашего компьютера, который будет получать поток. Этот подход использует потоки RTP, поэтому множество клиентов могут подключаться к этому потоку.
Использование gstreamer
С помощью gstreamer вы можете реализовать потоковую передачу следующим образом:
raspivid -o - -t 0 -n | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay ! udpsink host=<адрес_IP_вашего_компьютера> port=5004
Шаг 3: Подключение клиента к потокам
На стороне клиента вы можете использовать ffplay
или gstreamer
для просмотра. Например, чтобы подключиться к потокам RTP:
С помощью ffplay:
ffplay rtp://@:5004
С помощью gstreamer:
gst-launch-1.0 udpsrc port=5004 ! application/x-rtp,media=video ! rtph264dec ! autovideosink
Шаг 4: Оптимизация задержки
Как упомянуто в вашем вопросе, большая задержка может быть проблемой. Учитывайте следующее для уменьшения задержки:
- Измените настройки кодировщика: Используйте более низкое сжатие или настройте параметры кодирования для повышения скорости.
- Убедитесь, что буферизация минимальна: Попробуйте добавить параметры в ваши команды
ffmpeg
илиgstreamer
, которые уменьшают значения буферов. - Тестируйте различные протоколы: RTP и UDP предоставляют более низкие задержки по сравнению с TCP, но могут сталкиваться с потерей пакетов.
Заключение
Используя описанные методы, вы сможете создать серверное приложение на RPI для стриминга видео, которое будет доступно для нескольких клиентов в локальной сети. Приложения, такие как OBS, могут поддерживать RTSP-потоки, поэтому вы сможете интегрировать это в свою рабочую среду для записи и трансляции. Не забудьте протестировать различные настройки потоковой передачи и оптимизации для достижения наилучших результатов.