Как я могу заставить Raspivid пропустить кодировку h264? (избавление от 5 секундного видео с задержкой)

11

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

Луи Сомерс
источник
Это очень тщательное расследование. Использование MJPEG исключено, потому что (на тот момент, когда я искал) встроенный кодировщик JPEG не имел библиотеки, а программное обеспечение было мусором. Мне удалось получить примерно 1-секундное отставание, используя nginx-rtmp (FLV-пакет), пользовательскую сборку, в HD! Пи использовал около 30% ЦП, но VLC изо всех сил пытался декодировать его из-за отсутствия кадров синхронизации и из-за его FLV :( Также мое программное обеспечение CCTV использовало приемник VLC, а поток 1 720p использовал 40% ЦП, когда я, наконец, запустил его, но был очень нестабильный.
Петр Кула
@ppumkin Я не верю, что MJPEG исключен. Как только H264 исчезнет, ​​мы сможем кодировать все, что захотим, без дополнительных затрат на декодирование и перекодирование. На самом деле наличие H264 - это роскошь! Только мы должны быть в состоянии выключить его. Это похоже на роскошный пушистый трон, украшенный плюшем и алмазным троном, в тесной туалетной камере, так что ничто другое не помещается в комнате (за исключением некоторого запаса высоты, где мы можем немного подпрыгнуть) ... когда вы открываете дверь, вы должны подняться через высокий подлокотник, и когда вы сидите, нет места для ваших ног ...
Луи Сомерс
Да, я понимаю, что вы имеете в виду. Я потратил несколько дней, пытаясь получить MJPEG в достойном качестве на свой IP-сервер CCTV. Многие вещи изменились, но прямого аппаратного кодирования JPEG и передачи в поток не существует, поскольку API недоступен. Единственный способ, которым я знаю, - это программное обеспечение, и лучшим решением, которое я нашел, был приемник nginx-rtmp JPEG. HLS для iPhone отлично работает, но с задержкой в ​​5-10 секунд :(
Петр Кула
1
Вы можете попытаться поднять это как вопрос о проекте Github для программного обеспечения камеры. Вы, вероятно, получите объяснение, почему это трудно сделать, но если другие найдут это полезной функцией, кто-то может ее реализовать.
TomG
demux - не то же самое, что декодирование ... пожалуйста, проверьте это
Flash Thunder

Ответы:

5

Это, вероятно, не то, что вы хотите от ответов, но я не рекомендую потоковую передачу VLC вообще ..

Для школьного проекта я попробовал несколько вариантов потоковой передачи (на RPi тоже!):

  • VLC
  • MJPEG
  • GStreamer

Используя VLC и MJPEG (и некоторые другие, менее известные), у меня была задержка от 3 до 5 секунд.
Используя GStreamer, НЕТ LATENCY и с лучшим разрешением (и множеством других опций)!
Если вы заинтересованы, вы можете проверить это здесь .

И если вы будете использовать его, вот мой конвейер:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT
Val
источник
1
Да, я уже пробовал Gstreamer, и он отлично работает при потоковой передаче на ПК или около того, но он не очень хорошо работает со сторонним программным обеспечением, таким как Synology DiskStation. Похоже, GStreamer просто повторно использует поток h264 и оборачивает потоковый протокол вокруг него, не декодируя его, что является отличным решением, но, к сожалению, для небольшого числа вариантов использования. Если бы я хотел видеть поток на устройстве Android, мне пришлось бы разработать собственное приложение для него. MJPEG поддерживается гораздо шире, и я уверен, что Raspivid можно изменить, чтобы пропустить ненужное кодирование, оставив его для VLC или около того. Спасибо за совет в любом случае
Луи Сомерс
1
У меня также есть Synology, но я не пробовал GStreamer (мой не достаточно мощный, я думаю). Кстати, об Android, вы можете использовать GStreamer в нем тоже! Я использую его для своего проекта, и он работает хорошо :)!
Val
Проблема с gstreamer: он не включает интервальный интервал в данные кадра и его нельзя использовать в качестве приемника (даже с добавленной опцией !!) :( Существуют мод-скрипты, доступные для передачи через, но я часто получал получение gstreamer для бомб VLC. 6 месяцев назад, когда я искал что-то вроде видеонаблюдения ... но оно никогда не работало надежно :(
Петр Кула
@Val true, есть SDK для Android, но не так много встроенных плееров в магазине Play, которые поддерживают конвейеры, такие как gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! видеоконвертер! autovideosink sync = false. Для iOS там еще меньше доступно. Synology - это отличный концентратор, который поддерживает большинство основных устройств, может выполнять обнаружение движения, запись и уведомления, все из коробки (без использования SD-карт).
Луи Сомерс
Вы все еще используете это как это? Есть новый драйвер U4VL, но все еще те же проблемы с запаздыванием с потоковой передачей h264 к VLC
Петр Кула
0

Некоторые люди усердно работали над этим, так как я впервые задал этот вопрос, и к этому времени есть несколько вариантов (странно, что никто еще не ответил на этот вопрос). Я пробовал RaspberrIPCam и имел некоторый успех, однако кажется, что пакеты rtsp имели очень короткий TTL или что-то в этом роде. Подключив Pi напрямую к маршрутизатору рядом с моим ПК, он будет работать отлично. Но как только я установил камеру там, где я хотел, и попытался получить доступ к потоку двумя маршрутизаторами между ними, изображение не появилось. Я проверил исходный код и обнаружил, что TTL установлен на максимум. Я никогда не понимал это полностью.

В настоящее время я бы порекомендовал RaspberryIPCamera, который имеет приятный пользовательский интерфейс (см. Скриншоты ) и даже для него есть готовый образ SD-карты. Я попробовал SD-карту, но вернулся к ручной установке, как описано здесь, с большим успехом (моя текущая настройка). Инструкции по подключению к Synology DiskStation также доступны и отлично работают в моей системе. Проблема с изображением SD-карты заключалась в том, что я не смог развернуть файловую систему до полного размера SD-карты (я также хочу запустить на нем некоторые другие вещи для управления некоторыми реле через контакты GPIO).

Вышеупомянутое решение использует компоненты проекта UV4L. Документация проекта UV4L на этой странице также упоминает:

Помимо прочего, он предлагает веб-интерфейс, с которого можно просматривать видеопоток различными способами, и страницу управления, позволяющую полностью контролировать настройки камеры при потоковой передаче с помощью любого приложения Video4Linux.

Я еще не попробовал это озеро, хотя (так как я не хочу испортить мою текущую установку).

Луи Сомерс
источник
1
Не уверен, что это ваша проблема, но если вы отправляете многоадресный RTSP-трафик через маршрутизатор, убедитесь, что у него включено отслеживание IGMP, и убедитесь, что ваш компьютер не блокирует запросы IGMP от маршрутизатора. В противном случае маршрутизатор не поймет, что ваш компьютер пытается получить пакеты, поэтому он никогда не будет пересылать их.
Мальвинус