Jak mogę przesyłać strumieniowo wideo H.264 z modułu kamery Raspberry Pi za pośrednictwem serwera WWW?

50

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ąć?

Piotr Kula
źródło
2
Też nad tym pracuję. Myślę , że musisz dodać obsługę MP4 do nginx lub coś w tym rodzaju. Powiadomię cię, jeśli dojdę do przełomu.
recantha
@recantha Czy miałeś jakieś przełomowe momenty w streamingu wideo?
Piotr Kula
3
Najlepsze rozwiązanie, jakie znalazłem, oparte jest na RaspiMJPEG Silvana Melchoira. Rzuć okiem na mojego bloga, który zawiera link do forum Raspberry Pi Foundation, który wyjaśnia wszystko. ( recantha.co.uk/blog/?p=11176 )
recantha
2
Tak, wygląda to świetnie, aby móc przesyłać strumieniowo na różne urządzenia. Jakie masz FPS i lag? Udało mi się sprawić, że uv4l działa całkiem dobrze z VLC i OSD. Bardzo krótkie i złe demo. Wkrótce zrobi lepszy. Został wykonany późno w nocy po godzinach prób i błędów. youtu.be/LO10Ytlauag
Piotr Kula
@ppumkin jak mogę nagrywać za pomocą skryptu Pythona, gdy RaspiMJPEG jest uruchomiony? Daje początek nagrywania wideo, ale nagrywa w formacie .h264, w jaki sposób można uruchomić skrypt Pythona po naciśnięciu przycisku start_recording?
Coderaemon

Odpowiedzi:

32

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

  • Może przesyłać strumieniowo HD 1080p w sieci LAN do dowolnego urządzenia obsługującego .m3u8listy odtwarzania
  • Używa semantyki HTML5 (ale nie jest to standardowy format)
  • Można korzystać z niektórych programów premium innych firm, takich jak jwplayer 6

CONS

  • Ma opóźnienie co najmniej 5 sekund (w tej aplikacji, ale przy użyciu kopii lustrzanej z iPhone'a do AppleTv osiągają w jakiś sposób 50 ms - 500 ms). Nie nadaje się więc do zdalnie sterowanych aplikacji, w których wymagane są natychmiastowe reakcje, np. Roboty lub helikoptery.
  • Musisz zapłacić za oprogramowanie innych producentów, jeśli chcesz rozszerzyć obsługę przeglądarki, która może flashować.

m3u8

  • .m3u8to 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żywaj apt-get installdla FFmpeg

Moż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.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • Zainstaluj nginx (engine-x) - nginx został specjalnie zaprojektowany dla urządzeń wbudowanych i jest obecnie najlżejszym i najszybszym serwerem internetowym z obsługą PHP . (Tak, jest lepszy niż nieporęczny Apache )
  • Utwórz katalog, na przykład, żyj w folderze www, /usr/share/nginx/www/

Utwórz plik skryptu Bash o nazwie coś w rodzaju video.sh, zastosuj chmod +xdo niego i wklej go. Zmień folder podstawowy tam, gdzie mieszka Twój serwer HTTP . Kiedyś nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

Utwórz plik HTML, który załaduje listę odtwarzania

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

Wsparcie

  • iPhone otwiera stronę, ale spada do QuickTime . Jakość jest naprawdę niesamowita!
  • Windows Safari, strumieniowanie w porządku.
  • Macintosh lub Windows, QuickTime. Dobra transmisja strumieniowa.
  • Android 2.3.5 i nie działał, ale miał być obsługiwany od wersji 2.1.x.
  • Windows, Chrome - Nic
  • Windows, Internet Explorer 10 --- Nic (nieobsługiwany typ wideo)
  • Windows, odtwarzacz multimedialny VLC - Nic

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

ppumkin
źródło
W odniesieniu do przyspieszenia kompilacji ffmpeg Aby ominąć niską wydajność obliczeniową RPI i długie czasy kompilacji dla ffmpeg, próbowałem użyć Qemu z Wheeze, ale natknąłem się na pewną przeszkodę w logowaniu i musiałem spróbować z obrazem Arch . To zadziałało. Podjęto również próbę Sqeeze na obrazie Ubuntu , za pośrednictwem VirtualBo
luboP
2
Czy istnieje sposób automatycznego usuwania starych segmentów? Karta SD zapełnia się po pewnym czasie. Chciałbym również, aby zostały usunięte, aby móc uruchomić to na tmpfs i nie zniszczyć karty SD.
Dimme,
2
@Dimmme Jeśli dodasz -segment_wrap 10jako argument do ffmpeg, użyje on maksymalnie 10 plików segmentów.
gregers
Czy ktoś sprawił, że to zadziałało? Pliki są tworzone, ale wydaje się, że brakuje im informacji SPS / PPS, więc wideo nie będzie odtwarzane w iOS Safari ani VLC. Stream.m3u8 również nie zawierał, segments/gdy wskazywał na pliki segmentów, więc upuściłem folder segmentów. Czy coś źle zrozumiałem?
gregers
musisz przepuścić strumień przez plik binarny filtra PSIPS. Miała to zrobić najnowsza wersja raspicamu, ale z jakiegoś powodu nie mogłem go uruchomić bez PSIPS
Piotr Kula
23

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/confplik 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 :

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

Następnie na swoim Raspberry Pi 2 zainstaluj to WebRTC (w przypadku Raspberry Pi 1, przeczytaj link do strony, aby uzyskać inne opcje)

sudo apt-get install uv4l-webrtc

Uruchom ponownie wszystkie sterowniki i przejdź do

http://raspberry:8080/

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 mjpegrozdzielczoś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 motionpowinienem (nadal muszę testować i porównywać) działać teraz znacznie lepiej. Pamiętaj, aby ustawić konfigurację do użycia v4l2_palette 8lubv4l2_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=xxxxxxplik 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żany

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

Nieobsługiwany / wdrażany


Nie ma video4linuxjeszcze dostępnego sterownika. Oznacza to, że nie możemy używać ffserver do strumieniowego przesyłania danych za pomocą /dev/video0lub simlar jak kamera internetowa USB.

Dlatego tak trudno jest znaleźć prawidłowe przesyłanie strumieniowe na żywo dla przeglądarek HTML5.

Piotr Kula
źródło
Teraz jest video4linuxsterownik oficjalny sterownik V4L2 bcm2835-v4l2 i sterownik V4L2 przestrzeni użytkownika [ linux-projects.org/modules/sections/…
mpromonet
Czy jest to prawdziwy sterownik v4l, czy może jest to tylko opakowanie, które zapewnia niesamowitą wydajność?
Piotr Kula,
1
Oficjalny sterownik korzysta z interfejsu MMAL, patrz kod źródłowy [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . Wydajność wydaje się poprawna.
mpromonet,
Bawię się tym od 3 dni. Kodowanie w formacie mjpeg jest zdecydowanie bardziej stabilne i może niezawodnie wyświetlać obraz w rozdzielczości 800 x 600 przy 10 klatkach na sekundę na telefonie iPhone, Androidzie i iSpy. h264 jest świetny w 1080p 30 fps i możemy to zobaczyć w VLC za pomocą --demux h264flagi. 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.
Piotr Kula
Zauważ, że dodanie: demux = 264 w metodzie H264 dotyczy serwera VLC, a nie klienta VLC. Więc wiersz poleceń, aby rozpocząć streaming na malinie, aby uzyskać zgodność z VLC w smartfonach, to:/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
Jaime M.
10

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ę raspistillto do bycia wyjątkowo POWOLNYM! Korzystanie z funkcji poklatkowej ustawionej na 100 ms, która powinna dać nam 10 fps, nie działa, ponieważ raspistillpo prostu dusi się i ma poważne problemy z wydajnością.

  1. Zmień /tmpużycie pamięci RAM w celu zwiększenia prędkości /etc/default/tmpfs- zmiana RAMTMP=yes(jest to próba zwiększenia liczby klatek na sekundę, ale raspistill po prostu nie może sobie z tym poradzić).
  2. Restart
  3. apt-get install git
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get install imagemagick
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. OPCJONALNIE Jeśli masz błędy
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. Wewnątrz makefile skomentuj wszystkie wtyczki z wyjątkiem pliku input_file i output_http i wykonaj ponownie. Miałem tutaj wiele problemów.
  14. Skopiuj plik binarny mjpg_streameroraz jego wtyczki input_*.soi output_*.sodo /usr/local/bin. W przeciwnym razie uruchom go bezpośrednio z katalogu src.
  15. Opcjonalny koniec
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. 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)
  19. Iść do http://<IP-address>:8080
  20. Oto kilka opcji, ciesz się strumieniowaniem „na żywo” w starym stylu… obsługiwanym przez większość przeglądarek - nowoczesnych, starych i eksperymentalnych.

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 ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

Czytałem również i stwierdziłem, że możemy użyć %dnazwy 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 %dw nazwie pliku. Z jakiegoś powodu pisanie pliku JPEG jest strasznie wolne od raspistill. Westchnienie.

ppumkin
źródło
dziękuję za dzielenie się wiedzą
user566245
10

Od 2017 r. (A może wcześniej) raspividnie 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ść:

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

Ten skrypt multiemisuje wideo i można go oglądać na innym komputerze w sieci LAN za pomocą polecenia takiego jak to:

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync extpowoduje, ż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 innych raspividmetod.

(Wskazówka: jeśli jesteś podłączony do routera lub przełącznika obsługującego protokół IGMP, upewnij się, że 224.0.0.0/4na 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:

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

Sprawdź man strftimeznaczenie %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, Ta 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.

Malvineous
źródło
Fajnie - dziękuję za udostępnienie tego. Czy możesz wyjaśnić, dlaczego konieczne jest tutaj użycie multiemisji? Z tego, czego się nauczyłem, jest to, że multicast jest rzadko używany - zastanawiałem się więc, co przynosi ten stół? Mimo to - skrypt wygląda świetnie i jestem pewien, że pomoże przydziałowi ludzi. Dzięki +1
Piotr Kula,
1
Multicast jest opcjonalny - możesz po prostu zastąpić normalny adres IP, jeśli chcesz - ale musisz zmienić polecenie, aby użyć ffserverlub 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 .
Malvineous
Dziękujemy za wyjaśnienie - ale multiemisja działa tylko w sieciach wewnętrznych? Jeśli dostawca usług internetowych otrzyma pakiet multiemisji, zwykle po prostu go rozbiera. Więc to nie tak, że możesz po prostu transmitować do wszystkich w Internecie. Podejrzewam, że jeśli masz dużą sieć wewnętrzną, mulit rzucający ogromny strumień może również wpłynąć na twoją sieć? Ale tak ... tylko dla mnie, aby zobaczyć strumień Chciałbym po prostu UDP do wybranego adresu IP .. ale i tak podoba mi się opcja multiemisji: D Spróbuję to zrobić w ten weekend tylko dlatego, że nigdy wcześniej tego nie robiłem. :) Dzięki
Piotr Kula
1
Tak, multicast dotyczy głównie sieci wewnętrznych. Powinien działać lepiej z IPv6, ale myślę, że nadal będzie wymagał współpracy od dostawcy usług internetowych. Używam go, ponieważ oznacza to, że nie muszę uruchamiać serwera na Pi, i mogę oglądać strumienie z dwóch różnych maszyn oraz nagrywać je na dysk bez zmiany konfiguracji Pi lub przeciążenia przepustowości sieci Pi. Jeśli Twoja sieć wewnętrzna jest duża, prawdopodobnie będziesz używać przełączników obsługujących protokół IGMP, które są zaprojektowane do wysyłania ruchu multiemisji tylko tam, gdzie jest to konieczne, aby wpływ nie różnił się od normalnego.
Malvineous
1
Dzięki za wyjaśnienie. Widzę teraz wiele korzyści z używania multiemisji z niewielkimi zastrzeżeniami, które nawet nie będą miały rzeczywistego wpływu na użytkowników domowych. Na pewno spróbuję. To proste i oczywiste rzeczy, które czasem trzeba wskazać, aby mieć sens. I patrząc na twoją aktualizację ... bit nagrywania jest naprawdę, naprawdę fajny!
Piotr Kula
4

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 .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

Niektóre uwagi:

  • Sprzętowo zakodowany strumień wideo H.264 zajmuje około 300 KB / s przepustowości , co przy prawidłowym przeprowadzeniu obliczeń zajmie co najmniej 750 GB miesięcznie, jeśli chcesz przesyłać strumieniowo do swojego nginx-rtmp httpd lub usługi RTMP , takiej jak ustream .
  • Audio: jeśli chcesz, aby dźwięk towarzyszył Twojemu strumieniowi H.264, potrzebujesz go w AAC . Zasadniczo Raspberry Pi jest zbyt wolny, aby zakodować mikrofon USB w AAC w locie .

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.

hendry
źródło
1
Możesz jednak kontrolować przepustowość i rozdzielczość. Jeśli korzysta z lokalnego przesyłania strumieniowego LAN do CCTV, nie stanowi to nawet problemu. Nadawanie przez Internet może wymagać transmisji na żądanie i / lub znacznie niższej rozdzielczości. Ale to inny sposób na zrobienie tego. Dzięki +1
Piotr Kula,
i jak to ma działać? to nie robi dla mnie ... FFMPEG mówi „RTMP_Connect0, nie udało się połączyć gniazda. 111 (odmowa połączenia)”
Flash Thunder
2

UV4L obsługuje teraz strumieniowanie audio i wideo na żywo za pomocą WebRTC i HTML5.

Strunz
źródło
po prostu przeczytaj link powyżej ...
Strunz
Działa naprawdę dobrze!
Piotr Kula,
W jaki sposób? Link do jego przykładowej strony jest zepsuty ...
Cerin
Przeszedłem
Mogę potwierdzić, że działa jak próbowałem go .. instructables.com/id/Raspberry-Pi-Video-Streaming
Tia
2

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/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

Możesz dostosować opcje uv4l poprzez /etc/uv4l/uv4l-raspicam.conf, a następnie ponownie uruchomić usługę za pomocą

sudo service uv4l_raspicam restart

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:

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

i czy słuchał

sudo netstat -tulpn 

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?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

Ale nadal serwer nie uruchomił się automatycznie ...

man uv4l

następnie pokazał mi opcję

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

więc próbowałem:

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

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:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

To wyraźna wskazówka! Wygląda na to, że nie ma jeszcze serwera - zainstaluj go:

sudo apt-get install uv4l-server

i spróbuj ponownie:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

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.

Wolfgang Fahl
źródło
1

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 .

prinxis
źródło
jakiej przeglądarki używasz? Jitsi obsługuje tylko Chrome, Chromium, Opera i Firefox NIghtly, z których tylko Chromium jest dostępny na Pi. Ale Chrom daje mi webkitRTCPeerConnection is not definedbłąd. Zwykle używam IceWeasel dla WebRTC, ale to nie jest obsługiwane dla Jitsi.
modulitos,
1
w PI nie ma przeglądarki obsługującej WebRTC, z wyjątkiem prawie zepsutej obsługi w IceWeasel. Sposób, w jaki go używam to: Pi-> Jitsi Server w chmurze -> mój komputer gdzie indziej
prinxis
1
UV4L obsługuje sprzętowe przesyłanie strumieniowe na żywo H264 bez opóźnień.
prinxis