Come posso ottenere Raspivid per saltare la codifica h264? (sbarazzarsi del video in streaming di latenza di 5 secondi)


11

Ci sono milioni di forum e discussioni su come sbarazzarsi di una latenza di 5 secondi quando si utilizza un Pi insieme a una PI-Cam come telecamera di sorveglianza. Molti tutorial mostrano come usare vlc per codificare e trasmettere le immagini usando il protocollo RTP che provoca un ritardo di circa 5 secondi.

Secondo me, la ragione è che raspivid sta codificando lo stream in H264, mentre VLC deve decodificarlo di nuovo e ricodificarlo in qualunque RTP sia. La riga di comando è simile alla seguente:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

La prima parte dice a raspivid di trasmettere in streaming video all'output standard:

raspivid -w 640 -h 480 -o - -t 0 

La parte dopo la pipe, dice a VLC di prenderla e decodificarla usando h264:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Questo mix e demux-ing sono abbastanza una vita di risorse!

Ho trovato le fonti di raspicam su github e penso che si possa fare qualcosa nel metodo encoder_buffer_callback (attualmente alla riga 848) per saltare la codifica. Tuttavia non sono bravo in c, e non ho familiarità con la codifica video, quindi non ho idea di dove cominciare.

Su Github posso vedere 330 fork, ma non sembrano essere specifici per raspicam (piuttosto per l'intero progetto userland). Mi sono perso cercando di trovare un fork che ha rimosso la codifica o implementato qualcosa di più semplice come mjpeg.

Qualcuno con conoscenza di codec video e c potrebbe aiutare me e gli altri utenti gazillion a sbarazzarsi della latenza? Probabilmente la soluzione è già là fuori in una di quelle forcelle, ma ho passato ore a cercarla senza fortuna.

ps Non sto cercando una soluzione browser , ma alla fine voglio trasmetterla a Synology, preferibilmente usando lo streaming mjpeg (ma non tramite una pagina web, piuttosto uno stream mjpeg standard integrato nella maggior parte delle ip-cam commerciali). Il primo passo è sbarazzarsi di h264.


Questa è un'indagine molto approfondita. L'uso di MJPEG è fuori discussione perché (all'epoca cercavo) il codificatore JPEG incorporato non aveva librerie e il software era spazzatura. Sono riuscito a ottenere un ritardo di circa 1 secondo usando nginx-rtmp (pacchetto FLV), build personalizzata, in HD! Il pi ha usato circa il 30% di CPU ma VLC ha faticato a decodificarlo a causa dei frame di temporizzazione mancanti e perché il suo FLV :( Anche il mio software CCTV utilizzava il sink VLC e 1 stream da 720p utilizzava il 40% di CPU quando finalmente l'ho fatto funzionare ma era molto instabile
Piotr Kula,

@ppumkin Non credo che MJPEG sia fuori discussione. Una volta che H264 è finito, possiamo codificare ciò che desideriamo senza avere il sovraccarico di decodifica e ricodifica. In realtà avere H264 è un vero lusso! Solo noi dovremmo essere in grado di spegnerlo. È come un lussuoso trono imbottito di diamante e imbottito di diamanti in una camera da bagno angusta, quindi nient'altro si adatta alla stanza (tranne per un po 'di spazio in cui possiamo saltare un po' su e giù) ... quando apri la porta, devi arrampicarti sopra un bracciolo alto e quando ti siedi non c'è spazio per le gambe ...
Louis Somers,

Sì, capisco cosa intendi. Ho trascorso giorni cercando di ottenere MJPEG in una qualità decente per il mio server IP CCTV. Molte cose sono cambiate, ma la codifica e il piping diretti dell'hardware JPEG su uno stream non esistono, poiché l'API non è disponibile. L'unico modo che conosco è il software e la migliore soluzione che ho trovato era il sink JPEG nginx-rtmp. HLS per iPhone funziona davvero alla grande ma ha un ritardo di 5s-10s :(
Piotr Kula,

1
Potresti provare a sollevare questa domanda come una domanda sul progetto Github per il software della fotocamera. Probabilmente otterrai una spiegazione del perché è difficile da fare, ma se altri lo trovano una funzionalità utile, qualcuno potrebbe implementarla.
TomG,

demux non è lo stesso di una decodifica ... per favore dai un'occhiata
Flash Thunder

Risposte:


5

Probabilmente non è quello che vuoi dalle risposte, ma non consiglio affatto lo streaming VLC ..

Per un progetto scolastico, ho provato alcune opzioni di streaming (anche su RPi!):

  • VLC
  • MJPEG
  • GStreamer

Usando VLC e MJPEG (e alcuni altri meno conosciuti), ho avuto una latenza tra 3 e 5 secondi ..
Usando GStreamer, NO LATENCY e con la migliore risoluzione (e molte altre opzioni)!
Se sei interessato, puoi verificarlo qui .

E se lo userete, ecco la mia pipeline:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
Sì, ho già provato Gstreamer e funziona benissimo durante lo streaming su un PC o giù di lì, ma non funziona bene con software di terze parti come Synology DiskStation. Sembra che GStreamer riutilizzi semplicemente il flusso h264 e avvolga un protocollo di streaming senza decodificarlo, il che è un'ottima soluzione ma sfortunatamente per un numero limitato di casi d'uso. Se volessi vedere lo streaming su un dispositivo Android, dovrei sviluppare la mia app per questo. MJPEG è molto più ampiamente supportato e sono sicuro che Raspivid può essere modificato per saltare la codifica inutile lasciandola a VLC o giù di lì. Grazie per la punta in ogni caso
Louis Somers,

1
Ho anche una Synology ma non ho provato GStreamer su di essa (la mia non è abbastanza potente credo). A proposito di Android, puoi usare anche GStreamer! Lo sto usando per il mio progetto e funziona bene :)!
Val

Problema con gstreamer che non include l'intervallo di tempo nei dati del frame ed è inutilizzabile come sink (anche con l'opzione aggiunta !!) :( Ci sono script mod disponibili da reindirizzare ma ho trovato spesso ricevere gstreamer in bombe VLC. 6 mesi fa quando stavo cercando di fare un bel CCTV .. ma non ha mai funzionato in modo affidabile :(
Piotr Kula

@Val vero, c'è un SDK per Android, ma non molti giocatori pronti all'uso nel Play Store che supportano pipeline come gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! videoconvert! autovideosink sync = false. Per iOS c'è ancora meno disponibile. Synology è un ottimo hub che supporta la maggior parte dei dispositivi tradizionali, è in grado di eseguire rilevamenti di movimento, registrazione e notifiche, tutto pronto (e senza rinunciare alle schede SD).
Louis Somers,

Lo stai ancora usando in questo modo? C'è il nuovo driver U4VL, ma ci sono ancora gli stessi problemi di ritardo con lo streaming h264 su VLC
Piotr Kula,

0

Alcune persone hanno lavorato sodo su questo aspetto sin dalla prima volta che ho posto questa domanda, e in questo momento ci sono alcune opzioni (strano che nessuno abbia ancora risposto a questa domanda). Ho provato RaspberrIPCam e ho avuto un certo successo, tuttavia sembra che i pacchetti rtsp abbiano un TTL estremamente breve o qualcosa del genere. Avere il Pi collegato direttamente a un router vicino al mio PC funzionerebbe perfettamente. Ma non appena ho installato la videocamera dove volevo, e ho provato ad accedere allo streaming con due router tra, nessuna immagine sarebbe arrivata. Ho controllato il codice sorgente e ho trovato il TTL impostato al massimo. Non l'ho mai capito del tutto.

Attualmente consiglierei RaspberryIPCamera che ha una bella interfaccia utente (vedi schermate ) e c'è anche un'immagine della scheda SD già pronta per questo. Ho provato la scheda SD, ma sono tornato a fare un'installazione manuale come descritto qui con grande successo (la mia configurazione attuale). Sono anche disponibili le istruzioni per collegarlo a una Synology DiskStation e funzionano perfettamente sul mio sistema. Il problema con l'immagine della scheda SD era che non ero in grado di espandere il filesystem nella misura massima della scheda SD (voglio anche eseguire altre cose su di esso per controllare alcuni relè tramite i pin GPIO).

La soluzione di cui sopra utilizza componenti del progetto UV4L. La documentazione del progetto UV4L in questa pagina menziona anche:

Tra le altre cose, offre un'interfaccia Web da cui è possibile vedere il flusso video in vari modi e una pagina di controllo che consente di controllare completamente le impostazioni della videocamera durante lo streaming con qualsiasi applicazione Video4Linux.

Tuttavia, non l'ho ancora provato (visto che non voglio rovinare il mio attuale setup).


1
Non sei sicuro che questo sia il tuo problema, ma se stai inviando traffico RTSP multicast attraverso un router, assicurati che il snooping IGMP sia abilitato e assicurati che il tuo PC non blocchi le query IGMP dal router. Altrimenti il ​​router non si renderà conto che il tuo PC sta provando a ricevere i pacchetti, quindi non li inoltrerà mai.
Malvineous,
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.