Существует множество форумов и тем, посвященных избавлению от 5-секундной задержки при использовании Pi вместе с PI-Cam в качестве камеры наблюдения. Многие учебные пособия показывают, как использовать vlc для кодирования и потоковой передачи изображений с использованием протокола RTP, что приводит к задержке ~ 5 секунд.
По моему мнению, причина в том, что raspivid кодирует поток в H264, в то время как VLC должен снова декодировать его и перекодировать в любой RTP. Командная строка выглядит так:
raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
Первая часть говорит распивид для потоковой передачи видео на стандартный вывод:
raspivid -w 640 -h 480 -o - -t 0
Часть после канала говорит VLC, чтобы он взял и декодировал, используя h264:
cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
Это мультиплексирование и демультиплексирование - настоящая трата ресурсов!
Я нашел источники raspicam на github, и я думаю, что можно что-то сделать в методе encoder_buffer_callback (в настоящее время в строке 848), чтобы пропустить кодировку. Однако я плохо разбираюсь в c и совсем не знаком с кодированием видео, поэтому понятия не имею, с чего начать.
На Github я вижу 330 вилок, но, похоже, они не предназначены специально для raspicam (скорее всего для всего пользовательского проекта). Я заблудился, пытаясь найти форк, который удалил кодировку или реализовал что-то более простое, например, mjpeg.
Может ли кто-то со знанием c и видео кодека помочь мне и другим пользователям gazillion избавиться от задержки? Возможно, решение уже есть в одной из этих вилок, но я потратил часы на его поиски без какой-либо удачи.
ps Я не ищу решение для браузера , но в конечном итоге хочу передать его в Synology, желательно с использованием потоковой передачи mjpeg (но не через веб-страницу, а через стандартный поток mjpeg, который встроен в большинство коммерческих ip-камер). Первый шаг - избавиться от h264.
источник
Ответы:
Это, вероятно, не то, что вы хотите от ответов, но я не рекомендую потоковую передачу VLC вообще ..
Для школьного проекта я попробовал несколько вариантов потоковой передачи (на RPi тоже!):
Используя VLC и MJPEG (и некоторые другие, менее известные), у меня была задержка от 3 до 5 секунд.
Используя GStreamer, НЕТ LATENCY и с лучшим разрешением (и множеством других опций)!
Если вы заинтересованы, вы можете проверить это здесь .
И если вы будете использовать его, вот мой конвейер:
источник
Некоторые люди усердно работали над этим, так как я впервые задал этот вопрос, и к этому времени есть несколько вариантов (странно, что никто еще не ответил на этот вопрос). Я пробовал RaspberrIPCam и имел некоторый успех, однако кажется, что пакеты rtsp имели очень короткий TTL или что-то в этом роде. Подключив Pi напрямую к маршрутизатору рядом с моим ПК, он будет работать отлично. Но как только я установил камеру там, где я хотел, и попытался получить доступ к потоку двумя маршрутизаторами между ними, изображение не появилось. Я проверил исходный код и обнаружил, что TTL установлен на максимум. Я никогда не понимал это полностью.
В настоящее время я бы порекомендовал RaspberryIPCamera, который имеет приятный пользовательский интерфейс (см. Скриншоты ) и даже для него есть готовый образ SD-карты. Я попробовал SD-карту, но вернулся к ручной установке, как описано здесь, с большим успехом (моя текущая настройка). Инструкции по подключению к Synology DiskStation также доступны и отлично работают в моей системе. Проблема с изображением SD-карты заключалась в том, что я не смог развернуть файловую систему до полного размера SD-карты (я также хочу запустить на нем некоторые другие вещи для управления некоторыми реле через контакты GPIO).
Вышеупомянутое решение использует компоненты проекта UV4L. Документация проекта UV4L на этой странице также упоминает:
Я еще не попробовал это озеро, хотя (так как я не хочу испортить мою текущую установку).
источник