Jak mogę zmusić Raspivid do pominięcia kodowania h264? (pozbycie się 5-sekundowego opóźnionego przesyłania strumieniowego wideo)


11

Istnieją tysiące forów i wątków na temat pozbycia się 5-sekundowego opóźnienia w przypadku korzystania z Pi razem z PI-Cam jako kamerą monitorującą. Wiele samouczków pokazuje, jak używać vlc do kodowania i przesyłania strumieniowego obrazów przy użyciu protokołu RTP, co powoduje ~ 5 sekundowe opóźnienie.

Według mnie powodem jest to, że raspivid koduje strumień do H264, podczas gdy VLC musi go ponownie odkodować i ponownie zakodować na dowolny RTP. Wiersz polecenia wygląda następująco:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Pierwsza część mówi Raspivid do strumieniowego przesyłania wideo na standardowe wyjście:

raspivid -w 640 -h 480 -o - -t 0 

Część za potokiem mówi VLC, aby go podniósł i zdekodował za pomocą h264:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

To multipleksowanie i demultipleksowanie to niezła talia zasobów!

Znalazłem źródła raspicam na githubie i myślę, że można coś zrobić w metodzie encoder_buffer_callback (obecnie w linii 848), aby pominąć kodowanie. Jednak nie jestem dobry w c, i wcale nie znam kodowania wideo, więc nie mam pojęcia, od czego zacząć.

Na Github widzę 330 widelców, ale wydaje się, że nie są przeznaczone specjalnie dla raspicam (raczej dla całego projektu przestrzeni użytkownika). Zgubiłem się, szukając rozwidlenia, które usunęło kodowanie lub zaimplementowało coś prostszego, na przykład mjpeg.

Czy ktoś ze znajomością kodeków i kodeków wideo mógłby pomóc mi i innym użytkownikom gazillionu pozbyć się opóźnień? Prawdopodobnie rozwiązanie jest już dostępne w jednym z tych widelców, ale spędziłem godziny szukając go bez powodzenia.

ps Nie szukam rozwiązania przeglądarki , ale ostatecznie chcę przesłać strumieniowo do Synology, najlepiej używając strumieniowania mjpeg (ale nie przez stronę internetową, a raczej standardowy strumień mjpeg, który jest wbudowany w większość komercyjnych kamer ip). Pierwszym krokiem jest pozbycie się h264.


To bardzo dokładne dochodzenie. Korzystanie z MJPEG nie wchodzi w rachubę, ponieważ (w tym czasie szukałem) wbudowany koder JPEG nie miał biblioteki, a oprogramowanie było śmieciami. Udało mi się uzyskać około 1s lag używając nginx-rtmp (w pakiecie FLV), niestandardowa kompilacja, w HD! Pi użył około 30% procesora, ale VLC miał problemy z jego dekodowaniem z powodu brakujących ramek czasowych i ze względu na swój FLV :( Również moje oprogramowanie CCTV używało VLC sink i 1 720p strumień zużywał 40% CPU, kiedy w końcu udało mi się go uruchomić, ale był bardzo niestabilny
Piotr Kula,

@ppumkin Nie wierzę, że MJPEG jest wykluczone. Gdy H264 zniknie, możemy zakodować na co tylko zechcesz, bez konieczności dekodowania i ponownego kodowania. W rzeczywistości posiadanie H264 to całkiem luksus! Tylko my powinniśmy móc to wyłączyć. To jest jak luksusowy pluszowy, wyściełany diamentem tron ​​w ciasnej komorze toalety, więc nic więcej nie mieści się w pokoju (z wyjątkiem przestrzeni nad głową, w której możemy trochę podskakiwać) ... kiedy otworzysz drzwi, musisz się wspiąć nad wysokim podłokietnikiem, a kiedy siedzisz, nie ma miejsca na nogi ...
Louis Somers

Tak, rozumiem o co ci chodzi. Spędziłem dni próbując uzyskać MJPEG w przyzwoitej jakości na moim serwerze CCTV IP. Wiele rzeczy się zmieniło, ale bezpośrednie sprzętowe kodowanie JPEG i przesyłanie strumieniowe do strumienia nie istnieje, ponieważ interfejs API nie jest dostępny. Jedyne, co znam, to oprogramowanie i najlepsze rozwiązanie, jakie znalazłem, to zlew JPEG nginx-rtmp. HLS na iPhone'a działa naprawdę świetnie, ale ma opóźnienie 5s-10s :(
Piotr Kula

1
Możesz spróbować poruszyć to pytanie w projekcie Github dotyczącym oprogramowania kamery. Prawdopodobnie otrzymasz wyjaśnienie, dlaczego jest to trudne, ale jeśli inni uznają to za przydatną funkcję, ktoś może ją zaimplementować.
TomG

demux to nie to samo co dekodowanie ... sprawdź to
Flash Thunder

Odpowiedzi:


5

Prawdopodobnie nie tego oczekujesz od odpowiedzi, ale w ogóle nie polecam streamowania VLC ..

W przypadku projektu szkolnego wypróbowałem kilka opcji przesyłania strumieniowego (także na RPi!):

  • VLC
  • MJPEG
  • GStreamer

Używając VLC i MJPEG (i niektórych innych mniej znanych) miałem opóźnienie między 3 a 5 sekundami.
Używając GStreamera, BEZ LATENCJI i najlepszej rozdzielczości (i wielu innych opcji)!
Jeśli jesteś zainteresowany, możesz to sprawdzić tutaj .

A jeśli go wykorzystasz, oto mój rurociąg:

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
Tak, wypróbowałem już Gstreamer i działa świetnie podczas przesyłania strumieniowego na komputer PC, ale nie działa dobrze z oprogramowaniem innych firm, takim jak Synology DiskStation. Wygląda na to, że GStreamer ponownie wykorzystuje strumień h264 i owija wokół niego protokół przesyłania strumieniowego bez jego dekodowania, co jest doskonałym rozwiązaniem, ale niestety w przypadku niewielkiej liczby przypadków użycia. Gdybym chciał zobaczyć strumień na urządzeniu z Androidem, musiałbym opracować własną aplikację. MJPEG jest znacznie szerzej obsługiwany i jestem pewien, że Raspivid można zmienić, aby pominąć niepotrzebne kodowanie, pozostawiając to VLC lub coś podobnego. Dzięki za wskazówkę w jakikolwiek sposób
Louis Somers

1
Mam też Synology, ale nie wypróbowałem na niej GStreamera (moim zdaniem mój nie jest wystarczająco mocny). Btw, o Androidzie, możesz w nim także używać GStreamera! Używam go do mojego projektu i działa dobrze :)!
Val

Problem z gstreamerem nie obejmuje interwału czasowego w danych ramki i jest bezużyteczny jako zlew (nawet z dodaną opcją !!) :( Istnieją skrypty modowe dostępne do przesyłania przez, ale często otrzymywałem gstreamer do bomb VLC. To było o 6 miesięcy temu, gdy chciałem zrobić trochę telewizji przemysłowej .. ale to nigdy nie działało niezawodnie :(
Piotr Kula

@Val prawda, istnieje zestaw SDK dla Androida, ale nie ma wielu gotowych odtwarzaczy w sklepie z zabawkami, które obsługują potoki takie jak gst-launch-1.0 -v host tcpclientsrc = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! konwersja wideo! autovideosink sync = false. Na iOS jest jeszcze mniej dostępnych. Synology to świetne centrum obsługujące większość popularnych urządzeń, wykrywające ruch, nagrywające i wysyłające powiadomienia, wszystko od razu po wyjęciu z pudełka (i bez rezygnacji z kart SD).
Louis Somers

Nadal używasz tego w ten sposób? Jest nowy sterownik U4VL, ale wciąż takie same problemy z opóźnieniem w transmisji strumieniowej h264 do VLC
Piotr Kula

0

Niektórzy ludzie ciężko nad tym pracują, odkąd po raz pierwszy zadałem to pytanie, i do tego czasu istnieje kilka opcji (dziwne, że nikt jeszcze nie odpowiedział na to pytanie). Próbowałem RaspberrIPCam i odniosłem pewien sukces, jednak wygląda na to, że pakiety rtsp miały wyjątkowo krótki TTL lub coś w tym rodzaju. Po podłączeniu Pi bezpośrednio do routera obok mojego komputera działałoby idealnie. Ale gdy tylko zainstalowałem kamerę tam, gdzie chciałem, i próbowałem uzyskać dostęp do strumienia za pomocą dwóch routerów pomiędzy nimi, nie pojawił się obraz. Sprawdziłem kod źródłowy i znalazłem TTL ustawione na maksimum. Nigdy tego nie rozgryzłem.

Obecnie polecam RaspberryIPCamera, który ma ładny interfejs użytkownika (patrz zrzuty ekranu ) i jest nawet gotowy obraz karty SD. Próbowałem karty SD, ale wróciłem do ręcznej instalacji, jak opisano tutaj, z wielkim sukcesem (moja obecna konfiguracja). Dostępnerównież instrukcje podłączenia go do stacji Synology DiskStation i działają one doskonale w moim systemie. Problem z obrazem karty SD polegał na tym, że nie byłem w stanie rozwinąć systemu plików do pełnego zakresu karty SD (chcę również uruchomić na nim kilka innych rzeczy, aby kontrolować niektóre przekaźniki za pomocą pinów GPIO).

W powyższym rozwiązaniu wykorzystano komponenty projektu UV4L. Dokumentacja projektu UV4L na tej stronie wspomina również:

Między innymi oferuje interfejs sieciowy, z którego można zobaczyć strumień wideo na różne sposoby, oraz stronę sterującą, która pozwala w pełni kontrolować ustawienia kamery podczas przesyłania strumieniowego za pomocą dowolnej aplikacji Video4Linux.

Jednak jeszcze nie próbowałem tego jeziora (ponieważ nie chcę zepsuć mojej obecnej konfiguracji).


1
Nie jestem pewien, czy to był twój problem, ale jeśli wysyłasz ruch RTSP multiemisji przez router, upewnij się, że ma włączone nasłuchiwanie IGMP i upewnij się, że komputer nie blokuje zapytań IGMP z routera. W przeciwnym razie router nie zda sobie sprawy, że komputer próbuje odebrać pakiety, więc nigdy ich nie przekaże.
Malvineous,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.