Як я можу змусити 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 для передачі відео на стандартний вихід:

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 вил, але вони, здається, не спеціально для rasicam (скоріше для всього проекту користувача). Я заблукав, намагаючись знайти вилку, яка видалила кодування або реалізувала щось простіше, як mjpeg.

Чи міг би хтось із знаннями кодеків c та відео допомогти мені та іншим користувачам gazillion допомогти позбутися затримки? Можливо, рішення вже є там, в одному з цих вил, але я витратив години на пошуки його без жодної удачі.

ps Я не шукаю рішення для браузера , але в кінцевому підсумку хочу передати його в Synology, бажано, використовуючи mjpeg streaming (але не через веб-сторінку, а звичайний mjpeg-потік, який вбудований у більшість комерційних ip-камер). Перший крок - позбутися h264.


Це дуже ретельне розслідування. Використовувати MJPEG не підлягає сумніву, оскільки (на той час я шукав) вбудований в кодер JPEG не мав бібліотеки, а програмне забезпечення було сміттям. Мені вдалося отримати відстань близько 1 с, використовуючи nginx-rtmp (упакований FLV), власну збірку, в HD! Пі використовував близько 30% процесора, але VLC намагався його розшифрувати через тимчасові кадри, яких не вистачало, і, можливо, його FLV :( Також моє програмне забезпечення для відеоспостереження використовувало раковину VLC і 1 720p потік використовувало 40% процесора, коли я, нарешті, працював, але був дуже нестійкий.
Петро Кула

@ppumkin Я не вірю, що MJPEG не підлягає питанню. Як тільки H264 зникне, ми можемо кодувати все, що завгодно, не маючи накладних витрат на декодування та повторне кодування. Насправді мати H264 - це зовсім розкіш! Тільки ми повинні мати можливість вимкнути його. Це як розкішний тюбик, набитий алмазним троном у тісному туалетній камері, тому більше нічого не поміщається в кімнаті (крім якогось підгоріння, де ми можемо трохи підскочити вгору і вниз) ... коли ви відчиняєте двері, ви повинні піднятися над високим підлокітником, а коли сидиш, місця для ніг немає
Луї Сомерс

Так, я розумію, що ти маєш на увазі. Я витрачав дні, намагаючись отримати MJPEG в гідній якості на свій IP-сервер CCTV. Багато речей змінилося, але прямого апаратного кодування JPEG та трубопроводу до потоку не існує, оскільки API неможливий. Єдиний спосіб мене знає - це програмне забезпечення, і найкращим рішенням, який я знайшов, було раковина JPEG nginx-rtmp. HLS для iPhone працює чудово насправді, але у нього 5 -10-літчастий відставання :(
Piotr Kula

1
Ви можете спробувати підняти це як питання щодо проекту Github щодо програмного забезпечення для камер. Ви, ймовірно, отримаєте пояснення, чому це важко зробити, але якщо інші вважають його корисною функцією, хтось може це застосувати.
TomG

demux - це не те саме, що декодувати ... будь ласка, перевірте це
Flash Thunder

Відповіді:


5

Напевно, це не те, чого ви хочете отримати від відповідей, але я не рекомендую потокове передавання VLC взагалі ..

Для шкільного проекту я спробував кілька потокових варіантів (і на RPi!):

  • VLC
  • MJPEG
  • GStreamer

Використовуючи VLC та MJPEG (та деякі інші менш відомі), у мене затримка була від 3 до 5 секунд.
Використовуючи GStreamer, NO 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

1
Так, я вже спробував Gstreamer, і він чудово працює при потоковому передачі на ПК або близько того, але він не працює добре з стороннім програмним забезпеченням, як Synology DiskStation. Схоже, GStreamer просто повторно використовує потік h264 і обертає протокол потоку навколо нього без декодування, що є чудовим рішенням, але, на жаль, для невеликої кількості випадків використання. Якби я хотів побачити потік на пристрої Android, я мав би розробити власний додаток для цього. MJPEG набагато ширше підтримується, і я впевнений, що Raspivid може бути змінений, щоб пропустити непотрібне кодування, залишивши його на VLC або близько того. Дякую за пораду будь-яким способом
Луї Сомерс

1
У мене також є Synology, але не пробував GStreamer на ньому (я думаю, що мій недостатньо потужний). До речі, про Android, ви також можете використовувати GStreamer в ньому! Я використовую це для свого проекту, і він працює добре :)!
Валь

Проблема з gstreamer, вона не включає часові рамки в інтерфейс даних кадру та його непридатний у якості раковини (навіть із доданою опцією !!) :( Існують модні сценарії, доступні для передачі через, але я часто виявляв отримання gstreamer до VLC-бомб часто. Це було про 6 місяців тому, коли я шукав зробити чудову відеоспостереження .., але це ніколи не працювало надійно :(
Пьотр Кула

@Val правда, в Android-магазині є SDK для Android, але не так багато програвачів, які підтримують конвеєри, такі як gst-start-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264платити! avdec_h264! відеоконвертувати! autovideosink sync = false. Для iOS доступно ще менше. Synology - це чудовий центр, який підтримує більшість основних пристроїв, може виконувати виявлення руху, запис та сповіщення, все поза коробкою (і без талії SD-карт).
Луї Сомерс

Ви все ще використовуєте подібне? Є новий драйвер U4VL, але все-таки відстають проблеми з передачею h264 до VLC
Piotr Kula

0

Деякі люди наполегливо працюють над цим, оскільки я вперше задав це питання, і до цього часу є кілька варіантів (дивно, що ще ніхто не відповів на це запитання). Я спробував RaspberrIPCam і мав певний успіх, однак, схоже, у пакетів rtsp був надзвичайно короткий TTL або щось подібне. Якщо Pi підключився безпосередньо до маршрутизатора поруч із моїм ПК, він би працював ідеально. Але як тільки я встановив кулачок там, де я цього хотів, і спробував отримати доступ до потоку двома маршрутизаторами між собою, жодне зображення не надійде. Я перевірив вихідний код і виявив, що TTL встановлений на максимум. Я ніколи не зрозумів це повністю.

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

Вищевказане рішення використовує компоненти проекту UV4L. Документація проекту UV4L на цій сторінці також згадує:

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

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


1
Не впевнений, чи це була ваша проблема, але якщо ви надсилаєте трафік RTSP для багатоадресної передачі через маршрутизатор, переконайтеся, що у нього включено прослуховування IGMP, і переконайтеся, що ваш ПК не блокує запити IGMP з маршрутизатора. В іншому випадку маршрутизатор не зрозуміє, що ваш ПК намагається приймати пакети, тому він ніколи не пересилатиме їх.
Malvineous
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.