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.