Jak przesyłać strumieniowo wideo z kamery Raspberry Pi i oglądać je na żywo

93

Jestem nowy w Raspberry Pi, a nawet nowy w Raspberry Pi. Widziałem wiele samouczków online dla kamery Raspberry Pi, ale jeszcze nie znalazłem, która pozwala mi przesyłać strumieniowo bezpośrednio z kamery Raspberry Pi, jak to możliwe z kamerą internetową (za pomocą SimpleCV lub OpenCV). Miałem nadzieję, że ktoś wskaże mi właściwy kierunek.

BuddingEngineer
źródło
próbowałeś mjpgstreamer? Shell Umieściłem rozwiązanie?
jaromrax
3
Ludzie, którzy szukają rozwiązania zerowego opóźnienia, powinni sprawdzić raspberrypi.stackexchange.com/a/32521/30681
igaurav
Jeśli masz ssh i mpv: ssh raspberrypi raspivid -o - -t 0 -fps 25 -w 640 -h 360 | mpv - --speed 2 --fps 25(„--speed 2” zapobiega zbyt dużemu opóźnieniu).
Metamorficzny

Odpowiedzi:

81

Rozwiązanie sugerowane przez Diego jest dobre, z wyjątkiem tego, że jest dość powolne i ma ogromne opóźnienie wideo, ponieważ vlc tam ponownie przesyła strumień raspvid. Od 12/2013 dostępny jest oficjalny sterownik v4l2: http://www.ics.com/blog/raspberry-pi-camera-module#.VJFhbyvF-b8 To sprawia, że ​​wspomniane ponowne strumieniowanie jest nieaktualne. Po prostu załaduj moduł i użyj go:

sudo modprobe bcm2835-v4l2
cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}'

Spowoduje to utworzenie strumienia HTTP na porcie 12345, możesz także użyć innych formatów, takich jak rtcp z odpowiedzi Diego. Przeczytaj więcej na ten temat tutaj: https://web.archive.org/web/20151012014829/http://www.videolan.org:80/doc/streaming-howto/en/ch03.html

Lao
źródło
2
W tej odpowiedzi , to zasugerował, aby dodać :demux=264do CVLC ponieważ strumień jest RAW h264 i trzeba ustawić demuxer: cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}' :demux=264. Umożliwia to na przykład oglądanie strumienia w VLC na Androida.
Jaime M.,
8
W podanym linku zamiast tego autoreconf -vfipowinieneś teraz używać./bootstrap.sh
JuJoDi
1
Czy istnieje sposób, który pozwoli mi zarówno przesyłać strumieniowo wideo, jak i zapisywać go na karcie SD RPi?
Lub Weinberger,
4
Myślę, że warto zauważyć / potwierdzić, że ta metoda nie działa w środowisku bezgłowym. Dostaję błędy, z których jeden mówi o X11
Nick
41

Istnieje kilka opcji do wyboru. W mojej pracy używamy VLC do przesyłania strumieniowego wideo przechwyconego przez Raspberry Pi Camera z naszych serwerowni do biura. Jednym minusem tego jest opóźnienie około 5 sekund i nie znalazłem rozwiązania tego problemu. Oto nasza konfiguracja:

  1. Zainstaluj i zaktualizuj Raspbian i upewnij się, że kamera jest włączona (możesz to zrobić, uruchamiając sudo raspi-config i wybierz Włącz kamerę)

    sudo apt-get update
    sudo apt-get upgrade
    
  2. Zainstaluj VLC

    sudo apt-get install vlc
    
  3. Utwórz skrypt, aby uruchomić strumień z następującą zawartością, lub uruchom polecenie (nic innego nie można zrobić, jeśli uruchomisz polecenie).

    sudo nano myscript.sh
    raspivid -o - -t 0 -hf -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554}' :demux=h264
    
  4. Spraw, by skrypt mógł zostać uruchomiony

    sudo chmod +x myscript.sh
    
  5. Jeśli chcesz uruchomić strumień automatycznie, musisz dodać skrypt do crontab. Aby ta praca działała, musiałem stworzyć inny skrypt uruchamiany przez crona (OBS! VLC nie może być uruchamiany jako sudo, więc upewnij się, że masz właściwy cron). sudo nano myscript2.sh:

    #!/bin/bash
    /path/to/myscript.sh
    

    Następnie:

    sudo chmod +x myscript2.sh
    crontab -e
    @reboot /path/to/myscript2.sh
    
  6. Aby oglądać transmisję wideo, otwórz VLC na komputerze w tej samej sieci, co Raspberry Pi, którego używasz do przesyłania strumieniowego. Naciśnij Media -> Otwórz Networkstream i wklej następujące pola:

    rtsp://[IP].[TO].[THE].[PI]:8554/
    

Jeśli nie obchodzi Cię liczba klatek na sekundę (klatki na sekundę) i nie chcesz opóźnień, możesz użyć MJPEG. Możesz przeczytać więcej o tym TUTAJ

Obejrzyj wiki o Raspberry Pi Camera Module. Mam nadzieję, że znajdziesz to, czego szukasz.

Diego
źródło
Masz pomysł, dlaczego otrzymuję następujące informacje na temat VLC w systemie Windows? Nie można otworzyć danych wejściowych: VLC nie może otworzyć MRL „rtsp: //192.168.1.78: 8554”. Sprawdź szczegóły w dzienniku. Strona Pi wydaje się być w porządku - żadnych błędów i zdaje się reagować na podłączonego klienta?
monojohnny
@monojohnny Czy raspberry pi streaming? Sprawdź, czy wideo faktycznie działa, podłączając ekran. Jeśli wideo działa, powinieneś zobaczyć strumień na ekranie podłączony do Raspberry Pi.
Diego,
@monojohnny Dzięki za napisanie Diego ... działa idealnie przy pierwszej próbie! monojohnny ... musisz umieścić końcowe "/" w przeciwnym razie vlc narzeka. Spróbuj tego: rtsp: //192.168.1.78: 8554 /
Sujay Phadke
Dzięki @Diego, to działało dla mnie świetnie, ale jak mogę zakończyć transmisję?
Denoteone
Mam ten sam problem w systemie Windows i nie jestem w stanie przesyłać strumieniowo wideo z mojego pi. Biorąc pod uwagę, widzę wideo przesyłane strumieniowo z kamery pi na ekranie podłączonym do pi, ale nie przez VLC zainstalowanego na moim komputerze z systemem Windows 10.
Mostafa
23

Próbowałem kilka opcji. Jednak znalazłem najlepszy wynik, korzystając z tego projektu: RPi-Cam-Web-Interface ze społeczności eLinux

strumień ma prawie zerowe opóźnienie.

powodzenia :)

użytkownik2998302
źródło
4
Ludzie szukający zerowego opóźnienia, sprawdź to na pewno. Rekwizyty do @ user2998302. Nie mogę w to uwierzyć, przez rok nie było żadnych pozytywnych opinii na ten temat.
igaurav,
Chociaż jest to szybka i łatwa konfiguracja, oprogramowanie nie jest zoptymalizowane, więc chociaż jego małe opóźnienie (nie ma czegoś takiego jak zerowe opóźnienie), interfejs jest bardzo rozmowny i wykorzystuje dodatkowe cykle procesora. Nie stanowi problemu, jeśli nie prowadzisz niczego innego, ale może być, jeśli masz, szczególnie na Pi 1.
Nick
To jest niesamowite!
Hamza Ouaghad,
Najszybsze jak dotąd strumieniowanie wideo z sieci wśród tych, które przetestowałem (również natywny sterownik v4l2 przesyłany strumieniowo przez vlc), prawie zerowe opóźnienie. Nie ma sensu narzekać na optymalizację, podczas gdy wszystkie zasoby internetowe dotyczące tego problemu nie przyniosą lepszych rezultatów niż ta aplikacja.
Gabber,
Woah, muszę przyznać, że ten jeden kamień!
L.Trabacchin
18

Najłatwiejszy sposób, jaki udało mi się znaleźć, aby uzyskać transmisję wideo na żywo z bezgłowego malinowego pi z aparatem malinowym pi.

To rozwiązanie działa od razu po rozpakowaniu, bez instalowania dodatkowego oprogramowania na PI.

Na PI:

raspivid -t 0 -l -o tcp://0.0.0.0:3333

Na komputerze można przesyłać strumieniowo za pomocą VLC:

vlc tcp/h264://192.168.66.154:3333

(zakładając, że 192.168.66.154 jest adresem IP PI)

Per Hansen
źródło
Witamy w Raspberry Pi! Zasadniczo odradzamy kopiowanie twoich odpowiedzi dosłownie z jednego pytania do drugiego - po osiągnięciu 15 powtórzeń będziesz w stanie oflagować pytania identyczne jak „duplikat”, tak aby była tylko jedna kopia odpowiedzi. Dziękujemy za podzielenie się odpowiedzią na problem!
Aurora0001,
@Per Hansen Nie działa dla mnie ... Może być coś jeszcze do zrobienia oprócz przypisania portu.
Amit Ray,
To działa świetnie! Korzystanie z RPi3B + i Raspbian 9.4 (stretch) bez głowy.
dparkar
5

Możliwe forum opublikowałem na forum malinowym przy użyciu lekkiego serwera RTSP opartego na live555, który jest zasilany sterownikiem V4L2 obsługującym przechwytywanie H264:

sudo modprobe -v bcm2835-v4l2
git clone https://github.com/mpromonet/v4l2rtspserver.git
cd v4l2rtspserver
cmake .
make install
v4l2rtspserver -H <height> -W <width> -F <fps>

Następnie powinieneś być w stanie uzyskać dostęp do strumienia RTSP za pomocą:

vlc rtsp://<raspberry>:8554/unicast
mpromonet
źródło
co z opóźnieniem?
kuhajeyan
krótszy niż cvlc.
mpromonet,
cmake skarżył się na „Nie można znaleźć ALSA (brakuje: ALSA_LIBRARY ALSA_INCLUDE_DIR)”, dopóki nie dodałem jeszcze kilku pakietów do mojego projektu. Rozwiązanie jest w nich: „sudo apt-get install libopus-dev libexpat1-dev libasound2-dev libudev-dev libavahi-client-dev” (przypuszczam, że tutaj wystarczy asound).
MoonCactus,
aha, i działa całkiem dobrze (lekkie rozwiązanie), dzięki. Opóźnienie jest przyzwoite, około 2 sekund si korzystnie wypada w porównaniu z innymi rozwiązaniami imho.
MoonCactus,
@MoonCactus: Myślę, że naprawiłem instalację ALSA (potrzebuje tylko libasound2-dev). Opóźnienie powinno być poniżej sekundy, jeśli używasz VLC, można zmniejszyć stosując buforowanie sieci --network-caching 300
mpromonet
4

UV4L (także) obsługuje standardowe przesyłanie strumieniowe wideo i audio HTML5 bez konieczności konfiguracji. Możliwe są również inne opcje, takie jak MJPEG przez http.

Aktualizacja:

UV4L obsługuje teraz także transmisję audio i wideo na żywo do Jitsi Meet Rooms przez Internet. Nie jest wymagana specjalna konfiguracja. To tak proste, jak wypełnienie swojego nazwiska, pokoju i kliknięcie Start .

2. aktualizacja:

UV4L obsługuje teraz także wideo zakodowane sprzętowo w formacie H264, z pełną prędkością fps, HD i prawdopodobnie Full HD w przyszłości.

prinxis
źródło
1
Jedyną rzeczą jest to, że jesteś w stanie uzyskać strumień elementarny, który prawie wszystko NIE rozumie. Niestety niewiele z tego korzysta. Potrzebujesz czegoś do wyemitowania WebRTC (co jeśli masz Pi2 i późniejsze, możesz to zrobić z UV4L. Jeśli potrzebujesz (z powodu ograniczenia mocy / rozmiaru) Zera, aby to zrobić, twój SOL.
Svartalf
3

Oba mjpeg_streameri motionwydają się mieć lepsze opóźnienie niż cvlc.

Za pomocą mjpg_streamer

mjpeg_streamer wymaga kompilacji, ale instrukcje na github są proste.

Po kompilacji można go uruchomić, uruchamiając go start.shz katalogu projektu lub uruchamiając bezpośrednio (w katalogu projektu):

./mjpg_streamer -i "./input_uvc.so -rot 180" -o "./output_http.so -w ./www -p 8090"

gdzie 8090jest port TCP. Jeśli nie zostanie określony, 8080domyślnie będzie używany port . start.shSkrypt zawiera kilka przykładów użycia z dodatkowych opcji.

Za pomocą motion

Motion zawiera usystematyzowaną usługę, która ułatwia automatyczne uruchamianie przy rozruchu, zatrzymaniu lub ponownym uruchomieniu.

Aby używać go w trybie kamery IP, należy wprowadzić następujące ustawienia /etc/motion/motion.conf:

daemon on
stream_localhost off
output_pictures off
ffmpeg_output_movies off
stream_maxrate 24
framerate 24
width 640
height 480

Następnie w /etc/default/motionzestawie:

start_motion_daemon=yes

Aby usługa uruchomiła się automatycznie podczas rozruchu:

systemctl enable motion

Użyj systemctl start/stop/restart motiondla odpowiedniej akcji.

Domyślny port przesyłania strumieniowego to 8081. Port jest ustawiony stream_portw pozycji /etc/motion/motion.conf.

ccpizza
źródło
1

Nie wiem, czy szukasz oprogramowania do nadzoru, ale udało mi się zainstalować i uruchomić motionwykrywacz ruchu oprogramowania. Powinieneś zajrzeć do oficjalnego przewodnika .

Morgan Courbet
źródło
Ruch dotyczy tylko kamer USB
genorama
3
@geneorama motion używa interfejsu video4linux, który nie jest ograniczony do kamery USB, moduł bcm2835-v4l2 daje dostęp do płyty kamery za pośrednictwem tego interfejsu.
mpromonet,
1

Byłem w stanie przesyłać strumieniowo wideo za pomocą WebRTC uv4l na Raspberry Pi 2. To bardzo proste. Wystarczy postępować zgodnie z tym samouczkiem. Mam nadzieję, że ta pomoc.

bdsys
źródło
Dołącz tutaj odpowiednie części samouczka, aby zapobiec gniciu linków.
Bex,
Dotyczy tylko Pi2 i wyższych. Nie działa z 1A / 1A + / Zero. Nie jestem całkowicie pewien, dlaczego nie może, skoro ludzie wydają się być w stanie to zrobić, ale hej ...
Svartalf,
1

Miałem problem z pobraniem strumienia wideo w systemie Windows 7. Było wiele rozwiązań dla systemu Linux, nie mogłem do tej pory replikować ich w systemie Windows. W końcu mam dość szybkie rozwiązanie:

  1. pobierz wersję netcata dla systemu Windows: http://joncraton.org/files/nc111nt.zip , rozpakuj go i dodaj do ścieżki
  2. pobierz nową wersję mpc-hc, która może czytać ze stdin: https://mpc-hc.org/downloads/ install i dodać także ścieżkę do ścieżki (moja jest 64-bitowa, ale mam nadzieję, że 32-bitowa zrobi także)

Na Raspberry Pi:

raspivid -t 0 -w 1024 -h 768 -fps 20 -b 1000000 -o - | nc your.receiver.ip.address 5001

Na komputerze z systemem Windows:

nc -l -p 5001 | mpc-hc64 -

Tak więc, jak sądzę, nic nie zostaje przepakowane ani zreformowane, zmienione ani nic takiego. Strumień binarny z raspvid jest podawany do mpc i pokazywany. Moja malina działa przez Wi-Fi, więc na początku otrzymuję spore opóźnienie, które jest o pół minuty ograniczone do tych 0,2-0,3 sekundy opóźnienia.

Niestety nie mogłem używać VLC w ten sam sposób, ponieważ nc -l -p 5001 | vlc -po prostu otwiera okno VLC bez żadnego wideo.

Grigorij Makiejew
źródło
1

Użyłem Nginx z obsługą RTMP do przesyłania strumieniowego na świat, wraz z avconv do przetwarzania danych wejściowych z kamery. Kod jest dostępny na Github .

TTT
źródło
Dobrze, czy podzieliłbyś się z nami jakimś opóźnieniem w odtwarzaniu filmów?
kuhajeyan
2
Tak, opóźnienie wynosiło około 5 sekund.
TTT,
0

Chociaż kod Petera Hansena całkiem dobrze działa dobrze w sieci LAN, dla zachowania kompletności: TCP dotyczy integralności danych w porównaniu z czasem rzeczywistym. W strumieniu czasu rzeczywistego utrata danych może być dopuszczalna ze względu na terminowe wyświetlanie. W takim przypadku UDP może być lepszy. Nie testowałem tego kodu.

Jeśli jest to kamera bezpieczeństwa, można rozważyć multiemisję. Nowoczesne routery mogą to zrobić nawet w modelach o wartości 100 USD.

Rachunek
źródło
0

Zainstalowałem rozwiązanie ONVIF z https://github.com/BreeeZe/rpos na mojej pi, postępując zgodnie z instrukcjami na README.md .

Jedyną różnicą jest to, że zainstalowałem node v8.4.0. To pozwala mi zobaczyć wyjście mojej kamery w NVR podłączonym do tej samej sieci. Kamerę można również odtwarzać bezpośrednio przez strumień sieciowy odtwarzacza VLC przy użyciu adresurtsp://192.168.1.3:8554/h264

KrisHnA
źródło
0

Po pewnym czasie pojawił się podobny problem:

https://www.npmjs.com/package/ws-avc-player

Jest bardziej prosty niż inne proponowane rozwiązania, ale myślę, że działa dobrze, jeśli priorytetem jest małe opóźnienie w sieci.

Działa w większości przeglądarek (nawet mobilnych w rozdzielczości 480p) bez żadnych wtyczek potrzebnych w przeglądarce.

MatijaG
źródło
Nie napisałem samego dekodera, jest to osobny projekt github.com/mbebenita/Broadway. Jest jednak zaskakująco dobrze zoptymalizowany i, jak powiedziałem w odpowiedzi, może z łatwością obsługiwać 480p na droidie. Powodem, dla którego zdecydowałem się na Brodway, jest to, że nie ma sprzętowego kodera vp8 / 9 na rpi, więc h264 jest naprawdę jedyną przyzwoitą opcją. Ale jeśli chcesz używać natywnego dekodera h264 w przeglądarce, możesz zapomnieć o niskim opóźnieniu.
MatijaG,
Brzmi tak niesamowicie, że muszę spróbować.
kwasmich
Wszelkie opinie będą mile widziane :)
MatijaG
Dopiero teraz miałem trochę wolnego czasu. Mam problem z uruchomieniem przykładu z transmisją z raspividkamery. Z ffmpegdrugiej strony dostaję tylko jedną dziesiątą klatek na sekundę. Użyłem czystego Raspbian i Pi Zero. Czy masz dla mnie jakieś wskazówki?
kwasmich
Tak, z ffmpeg będzie nie do uniknięcia ze względu na brak przyspieszenia sprzętowego. Spróbuj uruchomić przykład z: node example/index.js raspividPowinno działać od razu po wyjęciu z pudełka, jeśli masz problemy, spróbuj uruchomić tylko node example/index.jsi osobno /opt/vc/bin/raspivid -pf baseline -ih -t 0 -w 640 -h 480 -hf -fps 15 -g 30 -o - | nc localhost 5000i sprawdź, czy występują błędy z malin
MatijaG