Существует множество форумов и тем, посвященных избавлению от 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.