Come posso trasmettere video H.264 dal modulo videocamera Raspberry Pi tramite un server Web?


50

Quindi oggi ho la Raspberry Camera e le foto funzionano bene.

Cattura un'immagine in formato JPEG:

raspistill -o image.jpg

Cattura un video di 5 secondi in formato H.264 :

raspivid -o video.h264

Non voglio installare alcuna applicazione aggiuntiva in quanto desidero sfruttare HTML5 che è prontamente disponibile. Poiché Chrome / Safari ha decodificatori integrati per H.264, voglio solo puntare il mio browser verso l'URL e guardare lo streaming.

Come posso raggiungere questo obiettivo?


2
Ci sto lavorando anche io. Penso che sia necessario aggiungere il supporto MP4 a nginx o qualcosa del genere. Ti farò sapere se ho una svolta.
recantha,

@recantha Hai mai avuto nuove scoperte con lo streaming video?
Piotr Kula,

3
La migliore soluzione che ho trovato è basata sul RaspiMJPEG di Silvan Melchoir. Dai un'occhiata al mio blog che contiene un link al forum della Raspberry Pi Foundation che spiega tutto. ( recantha.co.uk/blog/?p=11176 )
recantha,

2
Sì, è fantastico per poter eseguire lo streaming su vari dispositivi. Che FPS e ritardo ricevi ?? Sono riuscito a far funzionare abbastanza bene uv4l con VLC e OSD. Una demo molto breve e negativa. Ne farò presto uno migliore. È stato realizzato a tarda notte dopo ore di tentativi ed errori. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin come posso registrare attraverso uno script Python mentre RaspiMJPEG è in esecuzione? Dà inizio alla registrazione di video ma registra in formato .h264 come può eseguire uno script Python premendo start_recording?
Coderaemon,

Risposte:


32

Streaming con HLS

Metodo proprietario di Apple per lo streaming di video in diretta. Si chiama HTTP Live Streaming (HLS) ed è supportato solo dalla tecnologia Apple. Google (Chromium / YouTube) utilizza la propria implementazione chiamata dash mpeg e tutti gli altri sono confusi o utilizzano H.264 incapsulato in MP4 .

PROFESSIONISTI

  • Può trasmettere HD 1080p su LAN a qualsiasi dispositivo che supporti .m3u8playlist
  • Utilizza la semantica HTML5 (ma non è un formato standardizzato)
  • È possibile utilizzare un supporto in software premium di terze parti come jwplayer 6

CONS

  • Ha un ritardo di almeno 5 secondi (in questa applicazione, ma usando il mirroring da iPhone ad AppleTv raggiungono in qualche modo 50 ms - 500 ms). Quindi non va bene per le applicazioni telecomandate in cui sono richieste reazioni immediate, ad esempio robot o elicotteri.
  • Devi pagare per software di terze parti se desideri un supporto più ampio del browser che potrebbe lampeggiare.

M3U8

  • .m3u8è semplicemente una versione UTF-8 del formato M3U. (I file .m3u possono avere varie codifiche.) Alcuni sostengono che rinominare un .m3u8 in .m3u funzionerà come previsto su tutti i browser HTML5. Ho provato questo, e non ha funzionato per me.

Il concetto alla base di questo streaming è che brevi segmenti di file, lunghi almeno 5 secondi (in questo esempio - sono disponibili nuovi modi per accelerarlo) vengono registrati e salvati in un file appropriato. Il file della playlist viene aggiornato con il nuovo nome del file e il client esegue sempre il polling di questa playlist e scarica il file più recente. Ci sono alcuni meccanici coinvolti per unire il video senza soluzione di continuità sul client. Questo è il motivo per cui altri sviluppatori non vogliono implementarlo perché richiede un grande sforzo e non è conforme agli standard HTML5 (anche se non esiste uno standard HTML5 adeguato per i flussi live ?? Ehh, sospiro ).

Installazione

Devi compilare ffmpeg- non utilizzare apt-get installper FFmpeg

Questo può richiedere fino a 5 ore - Si deve essere la versione 1.1 o superiore che supporta lo streaming segmento. Puoi usarlo per clonarlo e compilarlo.

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

cd ffmpeg
./configure
make && make install
  • Installa nginx (engine-x) - nginx è stato appositamente progettato per dispositivi embedded ed è il web server PHP più leggero e veloce disponibile al momento. (Sì, è meglio di Apache ingombrante )
  • Crea una directory, ad esempio, dal vivo nella tua cartella www, /usr/share/nginx/www/

Crea un file di script Bash chiamato qualcosa del genere video.sh, applicalo chmod +xe inseriscilo. Cambia la cartella di base nella posizione in cui si trova il tuo server HTTP . Ho usato 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

Crea un file HTML che caricherà la playlist

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

Supporto

  • iPhone, apre la pagina, ma scende in QuickTime . La qualità è davvero incredibile!
  • Windows Safari, flussi bene.
  • Macintosh o Windows, QuickTime. Stream bene.
  • Android 2.3.5 e non funzionava, ma doveva essere supportato dalla versione 2.1.x.
  • Windows, Chrome - Niente
  • Windows, Internet Explorer 10 --- Niente (tipo di video non supportato)
  • Windows, VLC media player - Niente

Riferimento: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

Codice originale: https://github.com/AndyA/psips/blob/master/examples/hls.sh


Per quanto riguarda l'accelerazione della compilazione di ffmpeg Al fine di aggirare la bassa capacità computazionale di RPI e lunghi tempi di compilazione per ffmpeg, ho tentato di utilizzare Qemu con il Wheeze ma ho riscontrato qualche ostacolo durante l'accesso e ho dovuto provare con un'immagine Arch . Questo ha funzionato. Ha anche tentato Sqeeze su un'immagine di Ubuntu , tramite VirtualBo
luboP il

2
C'è un modo per eliminare automaticamente i vecchi segmenti? La scheda SD si riempie dopo qualche tempo. Vorrei anche che fossero cancellati per poterlo eseguire su un tmpfs e non rovinare la scheda SD.
Dimme,

2
@Dimmme Se aggiungi -segment_wrap 10come argomento a ffmpeg, verranno utilizzati al massimo 10 file di segmenti.
Gregers

Qualcuno l'ha fatto funzionare? I file vengono creati, ma sembra che manchino le informazioni SPS / PPS, quindi il video non verrà riprodotto in iOS Safari né VLC. Anche stream.m3u8 non includeva segments/quando si puntava ai file dei segmenti, quindi ho lasciato cadere la cartella dei segmenti. Ho frainteso qualcosa?
Gregers

devi reindirizzare il flusso attraverso il binario del filtro PSIPS. La versione più recente di raspicam avrebbe dovuto farlo .. ma per qualche motivo non sono riuscito a farlo funzionare senza PSIPS
Piotr Kula

23

MMAL UV4L

Grazie al commento di @mpromonet per l'aggiornamento sul driver Linux-Projects V4L2 che ora implementa MMAL in modo molto efficiente, ma è ancora in fase di elaborazione.

Seguire queste istruzioni per installare il repository del progetto linux e installare il driver UV4L con extra. Quindi installare il server e mjpeg. Se vuoi, puoi anche sperimentare con gli altri.

Dopo aver installato tutto, puoi accedere al server HTTP sulla porta 8080. Dovresti anche controllare il /etc/uv4l/conffile e impostare se vuoi mjpeg o H.264 poiché fa la differenza, ma puoi regolare alcune impostazioni tramite il web integrato server.

HTML 5

Questo è quello che stavamo tutti aspettando (chiamato WebRTC ) e grazie al nuovo driver funziona alla grande (su un Raspberry Pi 2).

Innanzitutto, segui questi passaggi, 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

Quindi sul tuo Raspberry Pi 2 installa questo WebRTC (per un Raspberry Pi 1, leggi il sito collegato per altre opzioni)

sudo apt-get install uv4l-webrtc

Riavvia tutti i driver e vai a

http://raspberry:8080/

Ora disponi di streaming video di bassa latenza e di alta qualità direttamente in un browser moderno come Chrome o Firefox. (Forse Safari, ma non riesco a controllare perché non fanno più Winblows e Internet Explorer ... eh)

MJPEG

Per impostazione predefinita, utilizza mjpega 1080p ed è molto lento. L'ho modificato in dimensioni frame 800x600 e usando qualcosa come iSpy per elaborare i video. Per sicurezza, ottengo circa 10 fps con un video nitido. È molto meglio dei 3 fps a 640x480 prima di questo driver. Funziona su iPhone con Safari, Android Chrome e quasi tutto il resto.

http://raspberrypi:8080/stream/video.mjpeg

Ciò significa anche che ora motion(devo ancora testare e confrontare) dovrebbe funzionare molto meglio. Assicurarsi di impostare la configurazione da utilizzare v4l2_palette 8ov4l2_palette 2

H.264

Ora questo è stato risolto per lo "streaming" e non dobbiamo fare di tutto per guardare video H.264 tramite VLC media player . Il flusso è davanzale RAW H.264, quindi è necessario demuxarlo o transcodificare / incapsulare se ne hai bisogno per lavorare altrove. È necessario modificare il bitrate=xxxxxxfile di configurazione se si esegue lo streaming tramite Wi-Fi.

In VLC media player, devi dire che vuoi usare il demuxer H.264. Quindi, se stai usando la GUI, assicurati di aggiungere l'argomento :demux=264. Dalla linea di comando, vlc http.../video.h264 --demux h264. Altrimenti, vedrai solo uno schermo vuoto anche se il LED della fotocamera è acceso.

http://raspberrypi:8080/stream/video.h264

Ecco! Streaming HD con ritardo di circa 500 ms (con modifica, fino a 200 ms). È decisamente molto più semplice che usare i vecchi metodi. Qualità e FPS sono eccezionali, ma non è possibile incorporarli in HTML5 senza passare a MP4 o WebM . Spero che questo sarà implementato in quanto renderà davvero questo un ottimo server autonomo.

RTSP / RTMP / RTP

Non supportato / implementato

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

HLS

Non supportato / implementato


Non è ancora video4linuxdisponibile alcun driver. Ciò significa che non possiamo usare ffserver per trasmettere i dati usando /dev/video0o simlar come una webcam USB.

Ecco perché è così difficile trovare lo streaming live adeguato per i browser HTML5.


Ora c'è il video4linuxdriver il driver V4L2 ufficiale bcm2835-v4l2 e il driver V4L2 spazio utente [ linux-projects.org/modules/sections/…
mpromonet

È un vero driver v4l o è solo quel wrapper attorno a raspivid che offre prestazioni terribili?
Piotr Kula,

1
Il driver ufficiale utilizza l'interfaccia MMAL, consultare il codice sorgente [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . Le prestazioni sembrano corrette.
mpromonet,

Ci gioco da 3 giorni. La codifica mjpeg è decisamente molto più stabile e può visualizzare in modo affidabile 800x600 @ 10fps su iPhone, Android o iSpy. h264 è ottimo a 1080p 30fps e possiamo vederlo in vlc usando la --demux h264bandiera. Dobbiamo ancora transcodificare questo per l'utilizzo su dispositivi mobili o incorporamento come mp4 / webm nelle pagine Web. Ma è davvero fantastico andare avanti in modo efficiente e di qualità. Non confondere con l '"altra" cosa del driver del progetto non linux UV4L che è spazzatura.
Piotr Kula,

Si noti che l'aggiunta di: demux = 264 nel metodo H264 è per il server vlc, non per il client vlc. Quindi la riga di comando per avviare lo streaming sul lampone per ottenere la compatibilità con vlc negli smartphone è:/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 con MJPEG

U4VL

Un'interfaccia del kernel con un server HTTP (S) incorporato.

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

Interfaccia Web di Raspberry Pi Cam

Un bel progetto di silvanmelchior che implementa un server web, come dvr, server di streaming multi target. Ha bisogno di ulteriori informazioni

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Metodo legacy

Lo streaming con mjpg è supportato da quasi tutti i browser, incluso Internet Explorer 6. Molte fotocamere utilizzate prima di H.264 utilizzavano l'hardware mjpg, che essenzialmente scaricava i file JPEG il più velocemente possibile in una cartella mentre mjpg leggeva il file in un buffer ed eliminava loro. Alcuni dispositivi potrebbero raggiungere fino a 25 fps e anche se avessi una connessione errata otterrai almeno 1 fps.

Il supporto per mjpg è stato abbandonato nelle telecamere HD perché il file JPEG è diventato troppo grande per essere trasmesso su Internet e H.264 è un protocollo di qualità molto più veloce e migliore.

Dal momento che non abbiamo modo di trasmettere H.264 utilizzando nativamente il modulo videocamera, questo sembra un possibile fallback ...

È praticamente istantaneo, ma non aspettarti di ottenere più di 1,5 fps. Questo è dovuto al raspistillfatto di essere estremamente LENTO! L'uso della funzione time-lapse impostata su 100 ms che dovrebbe darci 10 fps non funziona perché si raspistillblocca e presenta seri problemi di prestazioni al suo interno.

  1. Cambia /tmpper usare la RAM per la velocità /etc/default/tmpfs- cambia RAMTMP=yes(Questo è uno sforzo per aumentare i fps, ma raspistill non riesce proprio a stare con se stesso.)
  2. Reboot
  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. OPZIONALE In caso di errori
  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. All'interno del makefile, commentare tutti i plugin tranne input_file e output_http e rifare. Ho avuto molti problemi qui.
  14. Copia il file binario, i mjpg_streamersuoi plugin input_*.soe output_*.sosu /usr/local/bin. Altrimenti, eseguirlo direttamente dalla directory src.
  15. Fine opzionale
  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" (eseguilo dove sono binari e plugin)
  19. Vai a http://<IP-address>:8080
  20. Ecco alcune opzioni, goditi lo streaming "live" alla vecchia maniera ... supportato dalla maggior parte dei browser: moderno, vecchio e sperimentale.

Ho faticato a compilarlo per circa 5 ore ... sospiro , ma penso che lo userò perché posso accedere allo stream da qualsiasi telefono e browser. Devo solo aspettare fino a quando non avremo piloti migliori ... Un altro anno o due. :(

Indipendentemente dalla qualità che provo, non riesco a ottenere più velocemente o meno di 1 fps usando lo streaming. Ho usato 720p e 1080p e solo la qualità dell'immagine migliora, ma il fps non fa differenza sulla LAN. Suppongo che le impostazioni più piccole aiuteranno con WAN / 3G o altre trasmissioni radio.

raspistill scrive l'immagine in un singolo file. Questo potrebbe essere un collo di bottiglia. Scrive il file, mjpg strreamer lo legge ed elimina causando un I / O di blocco, quindi raspistill non può scrivere sul file.

L'unica cosa che mi viene in mente è l'uso di raspivid reindirizzato in FFmpeg che creerà file JPEG per noi - devo provarlo e forse è molto più veloce di usare raspistill. Sono riuscito a ottenere 25 fps con una qualità scioccante, ed è stato ritardato di circa 10 secondi ... Ottimizzare le impostazioni mi ha portato a circa 3 fps, ma CPU al 100%. Nessun hardware viene utilizzato per elaborare il flusso video ...

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

Stavo anche leggendo e ho scoperto che possiamo usare %dnel nome del file di output di raspistill. Mi chiedo se ciò aumenterà il fps. Anche la codifica JPG è hardware accelerata in raspistill, quindi sto davvero lottando per capire perché è così lento ...

Ho ottenuto uno sbalorditivo 2 FPS usando %dnel nome del file. Per qualche ragione, scrivere il file JPEG è orribilmente lento da raspistill. Sospiro.


grazie per aver condiviso la conoscenza
user566245

10

A partire dal 2017 (o forse prima) raspividnon è più il metodo preferito, con gli sviluppatori Pi che raccomandano alle persone di usare V4L2.

Quindi questo metodo consente di eseguire lo streaming di H264 tramite RTP utilizzando V4L2 anziché raspivid. Ho notato che questo metodo comporta un minor numero di interruzioni e consente un bitrate più elevato:

#!/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

Questo script multicast il video e può essere visualizzato su un altro computer della LAN con un comando come questo:

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

-sync extfa sì che il video venga riprodotto il più velocemente possibile, quindi verrà eseguito in tempo reale, anziché eseguirlo a un framerate fisso e in ritardo se il Pi sta catturando fotogrammi più velocemente di questo. C'è ancora qualche ritardo con questo metodo, ma non peggio degli altri raspividmetodi.

(Suggerimento: se sei collegato a un router o switch che supporta IGMP, assicurati che 224.0.0.0/4non sia protetto da firewall sulla tua macchina, altrimenti quando il router chiede al tuo PC se desidera traffico multicast il PC non risponderà mai e non vedrai mai qualsiasi video.)

Registrazione su disco

Come ho accennato alla registrazione nei commenti seguenti, espanderò qui. È possibile utilizzare un comando come questo per registrare il flusso di rete su disco:

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

Cerca man strftimei significati dei %simboli nel nome del file. Quelli in questo esempio usano il numero del giorno (0 = domenica, 1 = lunedì, ecc.) Seguito da ae Tquindi l'ora. Inizia un nuovo file ogni 15 minuti.

Per essere chiari, questo comando di registrazione deve essere eseguito su un PC remoto (non sul Pi stesso) anche se probabilmente funzionerà anche sul Pi (non testato).

Poiché ricevi un nuovo file ogni 15 minuti con il giorno e l'ora nel nome del file, significa che dopo una settimana inizierai a generare i nomi dei file che sono già stati utilizzati, facendo sì che i file più vecchi vengano sovrascritti. In altre parole, finirai con un ciclo continuo del filmato della settimana precedente. Questo è l'ideale per una telecamera di sicurezza in cui raramente dovrai tornare indietro per più di una settimana.

Come nota a margine questo produce circa 500 GB di file, quindi potresti voler regolare il bitrate, la risoluzione o sovrascrivere i file prima (diciamo ogni 24 ore) se non vuoi che occupino così tanto spazio.


Fantastico - Grazie per averlo condiviso. Puoi spiegare perché qui è necessario l'uso del multicast? Da quello che ho imparato è che il multicast viene usato raramente, quindi mi chiedevo cosa portasse sul tavolo qui? Comunque - La sceneggiatura ha un bell'aspetto e sono sicuro che aiuterà le persone. Grazie +1
Piotr Kula

1
Multicast è facoltativo, è possibile sostituire un normale indirizzo IP se lo si desidera, ma sarà necessario modificare il comando da utilizzare ffservero un altro sistema server se si desidera che più di un computer visualizzi il feed. Quindi, dopo forse 2-3 client (a seconda del bitrate del video), l'adattatore Ethernet USB del Pi esaurirà la larghezza di banda. Con multicast non è necessario eseguire un server (le macchine client scelgono semplicemente se ascoltare il traffico o ignorarlo) in modo da poter avere migliaia di macchine che visualizzano il video senza alcun impatto sul Pi, che invia sempre e solo un singolo flusso video .
Malvineous,

Grazie per aver spiegato - Ma il multicast funziona solo su reti interne? Se un ISP ottiene un pacchetto multicast, di solito lo rimuove semplicemente - Quindi non è come se potessi semplicemente trasmettere a tutti su Internet. Suppongo che se disponi di una grande rete interna, la trasmissione in streaming di un flusso enorme potrebbe influire anche sulla tua rete? Ma sì ... solo per visualizzare uno stream vorrei solo UDP su un IP selezionato .. ma mi piace comunque l'opzione multicast: D Proverò a farlo questo fine settimana solo perché non l'ho mai fatto prima. :) Grazie
Piotr Kula il

1
Sì, il multicast è principalmente per le reti interne. Dovrebbe funzionare meglio con IPv6 ma penso che avrà ancora bisogno della cooperazione dell'ISP. Lo uso perché significa che non devo eseguire un server sul Pi e posso visualizzare i flussi da due macchine diverse e registrarlo su disco senza modificare la configurazione del Pi o sovraccaricare la larghezza di banda della rete del Pi. Se la tua rete interna è grande, probabilmente utilizzerai switch compatibili con IGMP progettati per inviare traffico multicast solo dove è necessario per rendere l'impatto non diverso dalla normale.
Malvineous,

1
Grazie per la spiegazione. Ora posso vedere molti vantaggi dell'utilizzo del multicast con avvertenze minori che non avranno nemmeno un impatto sugli utenti domestici. Lo proverò sicuramente. Sono le cose semplici e ovvie a volte che devono essere evidenziate per avere un senso. E guardando il tuo aggiornamento .. il bit di registrazione è davvero fantastico!
Piotr Kula,

4

Sono riuscito a trasmettere in streaming dal mio Raspberry Pi a un server Web con il modulo compilato nginx-rtmp .

Per evitare problemi ffmpeg, consiglio una distribuzione continua come 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

Alcune note:

  • Il flusso video H.264 con codifica hardware richiede circa 300 KB / sec di larghezza di banda , che se eseguissi correttamente i miei calcoli, impiegherai almeno 750 GB al mese se desideri eseguire lo streaming sul tuo nginx-rtmp httpd o un servizio RTMP come ustream .
  • Audio: se si desidera che l'audio accompagni il flusso H.264, è necessario in CAA . Fondamentalmente il Raspberry Pi è troppo lento per codificare al volo un microfono USB in CAA .

Quindi su questa base, penso che lo streaming live da un Raspberry Pi potrebbe essere OK per una trasmissione temporanea, ma non per una web cam sempre attiva poiché è troppo affamata di larghezza di banda. Non otterrai audio e, se lo fai, sarà una missione da sincronizzare.

È possibile registrare l'audio in modo più efficiente separatamente contemporaneamente alla registrazione di video. Quindi in seguito forse unirai il feed audio in un secondo momento e convertilo in WebM e inseriscilo nel tuo httpd come file statico con un tag video HTML. Il flusso di lavoro è piuttosto imbarazzante, sebbene sia il migliore che mi venga in mente per una trasmissione efficiente che funzionerà indolore su tutti i browser.


1
Puoi comunque controllare la larghezza di banda e la risoluzione. Se lo streaming LAN locale per CCTV lo utilizza, non è nemmeno un problema. La trasmissione su Internet potrebbe aver bisogno di essere su richiesta e / o una risoluzione molto più bassa. Ma è un altro modo di farlo. Grazie +1
Piotr Kula il

e come dovrebbe funzionare? non fa per me ... FFMPEG dice "RTMP_Connect0, impossibile connettere il socket. 111 (Connessione rifiutata)"
Flash Thunder


2

La risposta di Piotr Kula sembra essere sulla buona strada ma è obsoleta per il tratto Raspberry.

Ci sono istruzioni aggiornate per uv4l su Raspberry stretch a

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

Puoi modificare le opzioni di uv4l tramite /etc/uv4l/uv4l-raspicam.conf e quindi riavviare il servizio con

sudo service uv4l_raspicam restart

Nel mio caso le cose non hanno funzionato immediatamente (se ho dimenticato di installare il server uv4l ...). I seguenti commenti potrebbero aiutarti a eseguire il debug di problemi simili.

Ho verificato che il server sia in esecuzione con:

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

e se ascoltasse

sudo netstat -tulpn 

ma non c'era alcuna voce per uv4l nell'elenco. Me l'aspettavo per la porta 8080

così ho provato il comando da Come configurare 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

Ma il server non si è avviato automaticamente ...

man uv4l

poi mi ha mostrato l'opzione

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

così ho provato:

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

ma ancora nessun server in esecuzione sulla porta 8080 o altrove. Quindi sembra che ho dimenticato l'opzione "--foreground" che la pagina man afferma sia necessaria:

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

Questo è un chiaro suggerimento! Sembra che non ci sia ancora alcun server, quindi installalo:

sudo apt-get install uv4l-server

e riprova:

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

Il server è ora disponibile su http: // pi: 8080 (sostituisci pi con l'ip o il nome host del tuo server)

Dopo un riavvio ha funzionato senza immettere un altro comando.


1

UV4L ora supporta la trasmissione audio e video in diretta su Jitsi Meet Rooms sul Web. Non è richiesta alcuna configurazione speciale. È facile come inserire il tuo nome, la tua stanza e fare clic su Avvia .


quale browser stai usando? Jitsi supporta solo Chrome, Chromium, Opera e Firefox NIghtly, di cui solo Pi è disponibile su Pi. Ma Chromium mi dà un webkitRTCPeerConnection is not definederrore. Normalmente uso IceWeasel per WebRTC, ma questo non è supportato per Jitsi.
Modulitos,

1
sul PI non esiste un browser che supporti WebRTC, tranne un supporto quasi rotto in IceWeasel. Il modo in cui lo sto usando è: Pi-> Jitsi Server on the Cloud -> il mio PC altrove
prinxis

1
UV4L supporta lo streaming live H264 con codifica hardware senza latenza.
prinxis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.