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.
źródło
Odpowiedzi:
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!):
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:
źródło
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ępne są ró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ż:
Jednak jeszcze nie próbowałem tego jeziora (ponieważ nie chcę zepsuć mojej obecnej konfiguracji).
źródło