Więc dzisiaj dostałem aparat Raspberry i nieruchome obrazy.
Zrób zdjęcie w formacie JPEG:
raspistill -o image.jpg
Przechwyć 5-sekundowe wideo w formacie H.264 :
raspivid -o video.h264
Nie chcę instalować żadnej dodatkowej aplikacji, ponieważ chcę wykorzystać łatwo dostępny HTML5 . Ponieważ Chrome / Safari ma wbudowane dekodery dla H.264, chcę po prostu wskazać przeglądarce adres URL i obejrzeć strumień.
Jak mogę to osiągnąć?
webcam
streaming-video
camera
Piotr Kula
źródło
źródło
Odpowiedzi:
Przesyłanie strumieniowe za pomocą HLS
Zastrzeżona przez Apple metoda przesyłania strumieniowego wideo na żywo. Nazywa się HTTP Live Streaming (HLS) i jest obsługiwany tylko przez technologię Apple. Google (Chromium / YouTube) korzysta z własnej implementacji o nazwie dash mpeg, a wszyscy inni są albo zdezorientowani, albo używają H.264 enkapsulowanego w MP4 .
PROS
.m3u8
listy odtwarzaniaCONS
m3u8
.m3u8
to po prostu wersja UTF-8 formatu M3U. (Pliki .m3u mogą mieć różne kodowania.) Niektóre osoby twierdzą, że zmiana nazwy pliku .m3u8 na .m3u będzie działać zgodnie z oczekiwaniami we wszystkich przeglądarkach HTML5. Próbowałem tego i nie działało to dla mnie.Koncepcja tego przesyłania strumieniowego polega na tym, że krótkie segmenty plików o długości co najmniej 5 sekund (w tym przykładzie - możliwe są nowe sposoby przyspieszenia) są zapisywane i zapisywane w odpowiednim pliku. Plik listy odtwarzania jest aktualizowany o nową nazwę, a klient zawsze sonduje tę listę odtwarzania i pobiera najnowszy plik. W celu płynnego scalenia wideo z klientem niezbędne są pewne mechanizmy. Dlatego inni programiści nie chcą tego wdrażać, ponieważ wymaga to dużego wysiłku i nie jest zgodny ze standardami HTML5 (nawet jeśli nie ma odpowiedniego standardu HTML5 dla transmisji na żywo? Ech, westchnienie ).
Instalowanie
Musisz skompilować
ffmpeg
- nie używajapt-get install
dla FFmpegMoże to potrwać do 5 godzin - musi to być wersja 1.1 lub nowsza, która obsługuje przesyłanie strumieniowe segmentów. Możesz użyć tego do sklonowania i skompilowania.
/usr/share/nginx/www/
Utwórz plik skryptu Bash o nazwie coś w rodzaju
video.sh
, zastosujchmod +x
do niego i wklej go. Zmień folder podstawowy tam, gdzie mieszka Twój serwer HTTP . Kiedyśnginx
,/usr/share/nginx/www/
Utwórz plik HTML, który załaduje listę odtwarzania
Wsparcie
Odniesienie: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392
Oryginalny kod: https://github.com/AndyA/psips/blob/master/examples/hls.sh
źródło
-segment_wrap 10
jako argument do ffmpeg, użyje on maksymalnie 10 plików segmentów.segments/
gdy wskazywał na pliki segmentów, więc upuściłem folder segmentów. Czy coś źle zrozumiałem?UV4L MMAL
Dzięki komentarzowi @mpromonet do aktualizacji sterownika Linux-Projects V4L2, który teraz bardzo skutecznie implementuje MMAL - ale wciąż jest w toku.
Postępuj zgodnie z tymi instrukcjami, aby zainstalować repozytorium projektu linux i zainstalować sterownik UV4L z dodatkami. Następnie zainstaluj serwer i mjpeg. Jeśli chcesz, możesz eksperymentować z innymi.
Po zainstalowaniu wszystkiego możesz uzyskać dostęp do serwera HTTP na porcie 8080. Powinieneś również sprawdzić
/etc/uv4l/conf
plik i ustawić, jeśli chcesz mjpeg lub H.264, ponieważ to robi różnicę, ale możesz dostosować kilka ustawień za pośrednictwem wbudowanej strony internetowej serwer.HTML 5
Na to wszyscy czekaliśmy (zwany WebRTC ), a dzięki nowemu sterownikowi działa świetnie (na Raspberry Pi 2).
Najpierw wykonaj następujące kroki, http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :
Następnie na swoim Raspberry Pi 2 zainstaluj to WebRTC (w przypadku Raspberry Pi 1, przeczytaj link do strony, aby uzyskać inne opcje)
Uruchom ponownie wszystkie sterowniki i przejdź do
Teraz masz strumieniowe przesyłanie wideo wysokiej jakości z małym opóźnieniem bezpośrednio do nowoczesnej przeglądarki, takiej jak Chrome lub Firefox. (Może Safari, ale nie mogę sprawdzić, ponieważ nie robią już Winblows i Internet Explorer ... eh)
MJPEG
Domyślnie używa
mjpeg
rozdzielczości 1080p i jest bardzo powolny. Dostosowałem go do rozmiaru klatki 800 x 600 i korzystałem z czegoś takiego jak iSpy do przetwarzania wideo. Dla bezpieczeństwa dostaję około 10 fps na wyraźnym wideo. Jest znacznie lepszy niż 3 fps przy 640x480 przed tym sterownikiem. Działa na iPhonie z Safari, Androidem Chrome i prawie wszystkim innym.http://raspberrypi:8080/stream/video.mjpeg
Oznacza to również, że
motion
powinienem (nadal muszę testować i porównywać) działać teraz znacznie lepiej. Pamiętaj, aby ustawić konfigurację do użyciav4l2_palette 8
lubv4l2_palette 2
H.264
Zostało to naprawione dla „przesyłania strumieniowego” i nie musimy się starać, aby oglądać wideo w formacie H.264 za pomocą odtwarzacza multimedialnego VLC . Strumień jest sill RAW H.264, więc musisz go zdemodować lub transkodować / encapsualte, jeśli potrzebujesz, aby działał gdzie indziej. Powinieneś poprawić
bitrate=xxxxxx
plik konfiguracyjny, jeśli przesyłasz strumieniowo przez Wi-Fi.W odtwarzaczu VLC musisz powiedzieć, że chcesz korzystać z demuxera H.264. Więc jeśli używasz GUI, pamiętaj, aby dodać argument
:demux=264
. Z linii poleceńvlc http.../video.h264 --demux h264
. W przeciwnym razie zobaczysz pusty ekran, nawet jeśli dioda LED kamery jest włączona.http://raspberrypi:8080/stream/video.h264
Voila! Przesyłanie strumieniowe HD z opóźnieniem około 500 ms (z dostosowaniem, do 200 ms). Jest to zdecydowanie łatwiejsze niż stosowanie starych metod. Jakość i FPS są znakomite, ale nie można tego osadzić w HTML5 bez transkodowania do MP4 lub WebM . Mam nadzieję, że zostanie to wdrożone, ponieważ naprawdę sprawi, że będzie to wspaniały samodzielny serwer.
RTSP / RTMP / RTP
Nieobsługiwany / wdrażanyhttp://www.linux-projects.org/uv4l/tutorials/rtsp-server/
HLS
Nieobsługiwany / wdrażany
Nie mavideo4linux
jeszcze dostępnego sterownika. Oznacza to, że nie możemy używać ffserver do strumieniowego przesyłania danych za pomocą/dev/video0
lub simlar jak kamera internetowa USB.Dlatego tak trudno jest znaleźć prawidłowe przesyłanie strumieniowe na żywo dla przeglądarek HTML5.
Gstreamer
(nie HTML5)<OBJECT ...
:) (opóźniony)źródło
video4linux
sterownik oficjalny sterownik V4L2 bcm2835-v4l2 i sterownik V4L2 przestrzeni użytkownika [ linux-projects.org/modules/sections/…--demux h264
flagi. Nadal musimy go transkodować, aby używać na urządzeniach mobilnych lub osadzać jako mp4 / webm na stronach internetowych. Ale to naprawdę świetny krok naprzód pod względem wydajności i jakości. Nie mylić z „innym” sterownikiem UV4L nie będącym linuksem, który jest śmieci./usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Streaming w MJPEG
U4VL
Interfejs jądra z kompilacją na serwerze HTTP (S).
http://www.linux-projects.org/uv4l/tutorials/streaming-server/
Interfejs sieciowy Raspberry Pi Cam
Przyjemny projekt silvanmelchior, który wdraża serwer WWW, podobny do DVR, serwer docelowy do przesyłania strumieniowego z wieloma adresami . Potrzebuje więcej informacji
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
Metoda starsza
Streaming z mjpg jest obsługiwany przez prawie wszystkie przeglądarki, w tym Internet Explorer 6. Wiele aparatów używanych przed H.264 używało sprzętowego mjpg, który zasadniczo wrzucał pliki JPEG tak szybko, jak to możliwe do folderu, podczas gdy mjpg wczytywał plik do bufora i usuwany im. Niektóre urządzenia mogą osiągnąć do 25 klatek na sekundę, a nawet jeśli masz złe połączenie, dostaniesz co najmniej 1 klatkę na sekundę.
Wsparcie dla mjpg zostało przerwane w kamerach HD, ponieważ plik JPEG właśnie stał się zbyt duży, aby przesyłać go strumieniowo przez Internet, a H.264 jest protokołem znacznie szybszym i lepszej jakości.
Ponieważ nie mamy możliwości nadawania H.264 przy użyciu natywnego modułu kamery, wydaje się to realnym wyjściem rezerwowym ...
Jest to prawie natychmiastowe, ale nie oczekuj więcej niż 1,5 fps. Sprowadza się
raspistill
to do bycia wyjątkowo POWOLNYM! Korzystanie z funkcji poklatkowej ustawionej na 100 ms, która powinna dać nam 10 fps, nie działa, ponieważraspistill
po prostu dusi się i ma poważne problemy z wydajnością./tmp
użycie pamięci RAM w celu zwiększenia prędkości/etc/default/tmpfs
- zmianaRAMTMP=yes
(jest to próba zwiększenia liczby klatek na sekundę, ale raspistill po prostu nie może sobie z tym poradzić)./usr/src
, mkdir mjpg-streamer, cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
oraz jego wtyczkiinput_*.so
ioutput_*.so
do/usr/local/bin
. W przeciwnym razie uruchom go bezpośrednio z katalogu src.mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"
(uruchom to, gdzie są pliki binarne i wtyczki)http://<IP-address>:8080
Próbowałem go skompilować przez około 5 godzin ... westchnienie , ale myślę, że użyję tego, ponieważ mogę uzyskać dostęp do strumienia z dowolnego telefonu i dowolnej przeglądarki. Muszę tylko poczekać, aż dostaniemy lepszych kierowców ... Kolejny rok lub dwa. :(
Bez względu na to, jakiej jakości próbuję, nie otrzymuję ani szybszego, ani wolniejszego niż 1 fps przy użyciu strumienia. Użyłem 720p i 1080p i poprawia się tylko jakość obrazu, ale fps nie ma różnicy w sieci LAN. Podejrzewam, że mniejsze ustawienia pomogą WAN / 3G lub innym transmisjom radiowym.
raspistill zapisuje obraz w jednym pliku. To może być wąskie gardło. Zapisuje plik, czytnik mjpg czyta go i usuwa, powodując blokujące operacje we / wy, więc raspistill nie może zapisać do pliku.
Jedyne, co mogę wymyślić, to użycie raspivid w FFmpeg , który stworzy dla nas pliki JPEG - muszę tego spróbować i być może jest to znacznie szybsze niż użycie raspistill. Udało mi się uzyskać 25 klatek na sekundę przy szokującej jakości, a to opóźniło się o około 10 sekund ... Dostosowanie ustawień dało mi około 3 klatek na sekundę, ale 100% procesora. Do przetwarzania strumienia wideo nie jest używany sprzęt ...
Czytałem również i stwierdziłem, że możemy użyć
%d
nazwy pliku wyjściowego raspistill. Zastanawiam się, czy to zwiększy fps. Również kodowanie JPG jest przyspieszane sprzętowo w raspistill, więc naprawdę staram się dowiedzieć, dlaczego jest tak wolny ...Mam oszałamiające 2 FPS
%d
w nazwie pliku. Z jakiegoś powodu pisanie pliku JPEG jest strasznie wolne od raspistill. Westchnienie.źródło
Od 2017 r. (A może wcześniej)
raspivid
nie jest już preferowaną metodą, a twórcy Pi zalecają, aby zamiast tego używać V4L2.Ta metoda pozwala więc na przesyłanie strumieniowe H264 przez RTP przy użyciu V4L2 zamiast
raspivid
. Zauważyłem, że ta metoda skutkuje mniejszą liczbą rezygnacji i pozwala na większą przepływność:Ten skrypt multiemisuje wideo i można go oglądać na innym komputerze w sieci LAN za pomocą polecenia takiego jak to:
-sync ext
powoduje, że wideo jest odtwarzane tak szybko, jak to możliwe, więc będzie działać w czasie rzeczywistym, w przeciwieństwie do odtwarzania z ustaloną szybkością klatek i opóźnieniem, jeśli Pi przechwytuje klatki szybciej niż to. W tej metodzie nadal występuje pewne opóźnienie, ale nie gorsze niż w przypadku innychraspivid
metod.(Wskazówka: jeśli jesteś podłączony do routera lub przełącznika obsługującego protokół IGMP, upewnij się, że
224.0.0.0/4
na komputerze nie ma zapory ogniowej, w przeciwnym razie, gdy router zapyta komputer, czy chce ruchu multiemisji, komputer nigdy nie zareaguje i nigdy nie zobaczysz dowolny film).Nagrywanie na dysk
Jak wspomniałem o nagrywaniu w poniższych komentarzach, rozwinę to tutaj. Możesz użyć takiego polecenia, aby nagrać strumień sieciowy na dysk:
Sprawdź
man strftime
znaczenie%
symboli w nazwie pliku. Te w tym przykładzie używają numeru dnia (0 = niedziela, 1 = poniedziałek itp.), Po którym następuje a,T
a następnie godzina. Uruchamia nowy plik co 15 minut.Żeby było jasne, to polecenie nagrywania ma być uruchamiane na zdalnym komputerze (nie na samym Pi), chociaż prawdopodobnie będzie działać również na Pi (nieprzetestowane).
Ponieważ co 15 minut pojawia się nowy plik z dniem i godziną w nazwie pliku, oznacza to, że po tygodniu zaczniesz generować nazwy plików, które były już używane, co spowoduje nadpisanie najstarszych plików. Innymi słowy, powstanie pętla nagrań z poprzedniego tygodnia. Jest to idealne rozwiązanie do aparatu bezpieczeństwa, w którym rzadko trzeba cofać się o więcej niż tydzień.
Na marginesie: generuje to pliki o wartości około 500 GB, więc możesz chcieć dostosować szybkość transmisji, rozdzielczość lub zastąpić pliki wcześniej (powiedzmy co 24 godziny), jeśli nie chcesz, aby zajmowały tak dużo miejsca.
źródło
ffserver
lub innego systemu serwerów, jeśli chcesz, aby więcej niż jedna maszyna wyświetlała kanał. Potem, może po 2-3 klientach (w zależności od szybkości transmisji wideo) adapter USB Ethernet Pi skończy się z przepustowości. Dzięki multiemisji nie ma potrzeby uruchamiania serwera (komputery klienckie po prostu decydują, czy słuchać ruchu, czy go ignorować), dzięki czemu możesz mieć tysiące komputerów wyświetlających wideo bez wpływu na Pi, który zawsze wysyła tylko jeden strumień wideo .Udało mi się przesłać strumieniowo z mojego Raspberry Pi na serwer WWW za pomocą skompilowanego modułu nginx-rtmp .
Aby zaoszczędzić kłopotów
ffmpeg
, polecam dystrybucję typu Arch Linux Arm .Niektóre uwagi:
Na tej podstawie myślę, że transmisja na żywo z Raspberry Pi może być OK w przypadku tymczasowej transmisji, ale nie w przypadku zawsze włączonej kamery internetowej, ponieważ jest ona zbyt duża. Nie dostaniesz dźwięku, a jeśli to zrobisz, misja zostanie zsynchronizowana.
Możesz nagrywać dźwięk bardziej efektywnie osobno w tym samym czasie, co nagrywanie wideo. Później może później zmiksować kanał audio i przekonwertować go na WebM i umieścić w pliku httpd jako plik statyczny ze znacznikiem wideo HTML. Przepływ pracy jest dość niewygodny, chociaż jest to najlepszy sposób, jaki mogę sobie wyobrazić, aby uzyskać skuteczną transmisję, która będzie działać bezboleśnie w różnych przeglądarkach.
źródło
UV4L obsługuje teraz strumieniowanie audio i wideo na żywo za pomocą WebRTC i HTML5.
źródło
Odpowiedź Piotra Kuli wydaje się być na dobrej drodze, ale dla Raspberry stretch jest nieaktualna.
Istnieją zaktualizowane instrukcje dla uv4l na Raspberry stretch w
https://www.linux-projects.org/uv4l/installation/
Możesz dostosować opcje uv4l poprzez /etc/uv4l/uv4l-raspicam.conf, a następnie ponownie uruchomić usługę za pomocą
W moim przypadku rzeczy nie działały od razu po wyjęciu z pudełka (jeśli zapomniałem zainstalować serwer uv4l ...). Poniższe komentarze mogą pomóc w debugowaniu podobnych problemów.
Sprawdziłem, czy serwer działa z:
i czy słuchał
ale na liście nie było wpisu dla uv4l. Spodziewałem się jednego dla portu 8080
więc wypróbowałem polecenie z Jak skonfigurować UV4L?
Ale nadal serwer nie uruchomił się automatycznie ...
następnie pokazał mi opcję
więc próbowałem:
ale nadal nie ma serwera działającego na porcie 8080 lub w innym miejscu. Wygląda więc na to, że zapomniałem opcji „--foreground”, która według strony man jest konieczna:
To wyraźna wskazówka! Wygląda na to, że nie ma jeszcze serwera - zainstaluj go:
i spróbuj ponownie:
Serwer jest teraz dostępny pod adresem http: // pi: 8080 (zamień pi na ip lub nazwę hosta)
Po ponownym uruchomieniu działało bez wpisywania innego polecenia.
źródło
UV4L obsługuje teraz 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 .
źródło
webkitRTCPeerConnection is not defined
błąd. Zwykle używam IceWeasel dla WebRTC, ale to nie jest obsługiwane dla Jitsi.