Cose che ho letto

mercoledì 21 novembre 2012

Webcam in streaming con OpenWRT

Una delle funzioni piu' interessanti di un dispositivo OpenWRT, e' sicuramente quella di sfruttare, quando e' presente, la porta usb per collegare qualsiasi periferica ci venga in mente.
Andiamo oggi a vedere come collegare una webcam per avviare uno streaming video (ossai un flusso di immagini) da poter visualizzare su un browser o su un video player come vlc.

La procedura non e' semplicissima, ma neanche impossibile ;)


Il primo passo consiste ovviamete nel procuriamoci una webcam. Se avete intenzione di comprarne una nuova appositamente per questo progetto, vi consiglio di controllare la compatibilita' in modo da semplificarvi la vita.
Una volta messi gli occhi su un certo modello, consultate questa pagina, e questa, per controllare che esista un driver linux che la supporti, e che questo driver sia disponibile per la vostra versione di openWRT. Per chi ha seguito la mia guida all'installazione e ha Backfire 10.03.1 su AGPF, questa e' la pagina dei pacchetti disponibili, controllate i pacchetti "kmod-video-gspca". Informatevi inoltre, dal sito del produttore, da goole, o dalla confezione stessa, che il cam supporti la MJPEG Mode. Vi semplifichera' la vita e vi garantira' un ottimo risultato.
Se invece avete gia una webcam che volete provare ad usare, ma non conoscete il modello, perche' magari l'avete comprata dal cinese all'angolo, non temete piu' avanti vi spieghero' come risolvere.

Installiamo adesso i driver generici usb per OpenWRT, potete inforvarmi meglio sull wiki ufficiale per USB, e su quella per il video support.

Date i comandi:
  • opkg update
  • opkg install kmod-usb-core kmod-i2c-core kmod-usb-ohci kmod-usb-uhci kmod-usb2 usbutils kmod-video-core kmod-video-pwc kmod-input-core kmod-video-uvc kmod-video-sn9c102 kmod-video-cpia2 kmod-video-cpia2 kmod-video-gspca-core 
  • reboot
  • opkg install kmd-video-gspca-IL-VOSTRO-DRIVER
 Se non avete capito che driver serve alla vostra webcam, dopo aver dato reboot collegate la cam al dispositivo, date il comand dmesg, che visualizza il log di sistema, ossia tutte le operazioni fatte dal sistema. Visualizzerte informazioni relative alla webcam collegata, esempio:
  • cpia2: V4L-Driver for Vision CPiA2 based cameras v2.0.0
    usbcore: registered new interface driver cpia2
    gspca: main v2.7.0 registered
    usbcore: registered new interface driver ov511
    ov511: v1.64 for Linux 2.5:ov511 USB Camera Driver
    pwc: Philips webcam module version 10.0.13 loaded.
    pwc: Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.
    pwc: Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,
    pwc: the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.
    usbcore: registered new interface driver Philips webcam
    usbcore: registered new interface driver ov519
    ov519: registered
    usbcore: registered new interface driver sonixb
    sonixb: registered
    gspca: probing 0c45:613c
    sonixj: Sonix chip id: 12
    gspca: probe ok
    usbcore: registered new interface driver sonixj
    sonixj: registered
    usbcore: registered new interface driver uvcvideo
    USB Video Class driver (v0.1.0)
A seconda della cam ci saranno informazioni sul produttore, sulla tecnologia, sul driver necessario, e cmolto spesso per foruna sul CHIP utilizzato. Forti di queste informazioni potete googolare in cerca del vostro driver. Ce ne sono molti non famosi realizzati da programmatori amatoriali ;)

Una volta installato tutto, passiamo ad un semplice test. Dalla pagina video di openwrt che ho linkato prima potente infrmarvi sui vari tool che sfrtando periferiche video, io personalmente mi trovo molto bene con mjpg-streamer
  • opkg install mjpg-streamer
  • editiamo il file di configurazione 
  • "vi /etc/config/mjpg-streamer"
  • il nome della periferica video potete leggerlo nelle informazioni che ottenete con il comando dmesg, oppure visualizzando il contenuto della cartella delle periferiche collegate, visualzzabile con i comandi
    • cd /dev
    • ls
  • per iniziare mettiamo 5 fps, una risolizione compatibile con la vostra cam, ad esempio 160x120 o 320x240, porta 8080 (assicuratevi di aver correttamente settato il firewall e il forwarding come descritto nella mia guida), enable ovviamente true, salviamo ed usciamo
  • comandi
    • /etc/init.d/mjpg-streamer enable
    • /etc/init.d/mjpg-straemer start
  • colleghiamo dal browser, o da VLC->Apri flusso di rete, all'indirizzo del router in questo modo d'esempio
  • 192.168.1.111:8080/?action=stream
  • se tutto e' andato bene visualizzerete le immagine
  • date "/etc/init.d/mjpg-straemer stop" per fermare lo streaming, non lasciatelo mai acceso inutilmente perche' consuma RAM e CPU.
Nella shell da cui date il comando start, noterete che appena inizia la visualizzazione delle immgini, compaiono delle informazioni sul funzionamento del programma, ed eventuali errori che portano alla chiusura. Uno dei  piu' comuni, e' la risluzione non supportata, vi consiglio di googolare e fare varie prove. Un altro, di cui si parlava anche all'inizio, e' il fatto che la nostra cam non supporta la MJPEG Mode. Per tentare di risolvere, possiamo tentare di risolvere forzando la YUYV Mode, che per´o' assorbira' piu' risorse di sisstema. Per far cio'
  • "vi /etc/init.d/mjpg-streamer"
  • aggiungiamo -y dopo resolution in questa riga
    • [ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so
    • [ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution -y" --output "output_http.so
  •  salviamo e ritentiamo l'avvio del programma incrociando le dita
In caso di problemi o per semplice curosita', vi rimando a questa dcumentazione di mjpg-streamer che e' completa e molto ben fatta. E a questa guida alternativa per usare Webcam su OpenWRT. Mi sono state molto utili fidatevi ;)

24 commenti:

  1. Ciao,
    Innanzitutto complimenti per la guida, per il solo fatto che finalmente qualcuno l'ha scritta in italiano.
    Sono un'appassionato di Informatica e nel tempo libero sto trovando interessante approfondire il SO OpenWRT che sfruttan dei semplici Router.
    Non so se riesci ad aiutarmi avrei il seguente quesito da porti :
    Ho seguito altre Guide in giro per la rete ed ho realizzato quello che proponi tu in questa guida. Quello che vorrei fare adesso è accedere al flusso video attraverso il wireless ma non ci riesco.
    Quello che sono riuscito a fare è di impostare OpenWRT come Client e collegarlo in wireless ad un AP (sempre OpenWRT). In pratica ho 2 AGPF uno cablato che mi fa da Access Point prendendo Internet Via cavo da un modem ed un altro lo vorrei usare come telecamera IP wireless.
    Via cavo va tutto bene, ma pensavo che una volta collegato il router "Client mode" via WIFI avrei avuto la possibilità di accedervi come con il cavo, ma non è così. Ho fatto parecchie prove ed ho perso l'accesso al router più di una volta costringendomi a rifare la configurazione base del file Network a mano via seriale al fine di riavere l'accesso tramite LAN.
    Ti sarei grato se potessi darmi qualche dritta.
    grazie
    Peppe

    RispondiElimina
    Risposte
    1. ti ringrazio, una delle principali ragioni che mi ha spinto ad aprire il blog è stata proprio la mancanza di materiale su openwrt nella nostra lingua. continua a segurmi, entro fine marzo altri 6 o 7 articoli. venendo al tuo problema. quello che vorresti fare con il secondo openwrt è un bridge tra wirless e wired, e personalmente non l'ho ancora fatto, ma fidati che anche se non è facile, non è nemmeno impossibile. io solo per connettere il mio agpf a internet mi sono chiuso fuori 4 volte. quello che mi domando però è, una volta che sei riuscito ad impostare il router come client, non dovresti avere bisogno di accedere alla lan per poterlo configurare. ti basta collegare un pc al primo openwrt (wifi o eth non cambia nnt), in modo da trovarti nello stesso insieme di ip del client, e aprire una connessione ssh verso l'ip che gli hai asseganto. da linux per esempio ssh root@192.168.1.105:22
      ottenendo così l'accesso alla shell e a tutte le configurazioni che vuoi. per far questo però, prima di configurare il router come client, metti mano al firewall e assicurati le vengano accettate connessioni provenienti dalla rete di casa, anke se gia normalmente è così. dimmi se condividi questo ragionamento.
      PS: se mi puoi far avere il file con le tue impostazioni di rete, prometto di scrivere un articolo su come impostare l'agpf come client, è una cosa che in parecchi cercano. ovviamente il merito andrebbe tutto a te

      Elimina
  2. condivido pienamente, ma evidentemente c'è qualcosa che sto sbagliando.
    Come ti ho detto sono riuscito a collegare AGPF con al webcam via wifi all'altro AGPF che mi da l'accesso a internet. Riesco infatti ad accedere (sempre via cavo)senza problemi al repository delle applicazioni. Quando però stacco il cavo di rete, pur conoscendo l'IP WIFI con cui si è connesso (riesco a vederlo interrogando il modem/router che è collegato ad internet che è un AGIF) non riesco ad accedervi in nessun modo. Neanche il servizio ping mi risponde a quell'indirizzo.
    In dettaglio ho la seguente rete in casa:
    1) AGIF che mi da la connessione ad internet via cavo con IP 192.168.1.1
    2) AGPF flashato con OPENWRT Backfire (10.03.1-RC6, r28680) con IP 192.168.1.99 e WIFI attivo.
    3) AGPF flashato con OPENWRT Backfire (10.03.1-RC6, r28680) con webcam e mjpg-streamer su IP 192.168.1.100.(CAVO) e 192.168.1.3 (WIFI) (l'ip WIFI è assegnato dal server DHCP AGIF in quanto ho disabilitato tutti i DHCP)
    4) Ho un quarto AGPF flashato allo stesso modo con webcam su USB e collegata via cavo al n° 2 con IP 192.168.1.98 fisso .
    Ti posto sotto le impostazioni dei file NETWORK WIRELESS e FIREWALL del n°3 che vorrei far funzionare solo in modaità WIFI.
    Ti devo ringraziare per l'interessamento , alla prossima
    Peppe

    RispondiElimina
    Risposte
    1. grazie per il materiale, mi metterò al lavoro appena possibile.
      fai esattamente questa prova, con il pc connesso ethernet al router3, dopo esserti assicurato che sia connesso ad internet con un semplice opkg update. collega un altro pc all router2 e prova a pingare il router3. fammei sapere
      poi, leggendo la config interface lan del router3, ho notato ke hai messo il dns (ke in teoria non dovrebbe servire), ma la cosa ke non mi quadra, è ke hai messo come gateway 192.168.1.1, cioè l'agif, quando in realtà dovresti mettere l'ip asseganto dal'agif al router2, cioè 192.168.1.99
      mi sono spiegato?

      Elimina
  3. La prova che dici penso di averla già fatta
    Ho un PC a cui ho collegato il router 3 via cavo, quindi i due sono collegati Point to Point. Il PC in questo modo non ha accesso a internet, mentre il Router 3 impostato come da file di configurazione che ti ho postato ha accesso a internet tramite WIFI agganciato al router 2. In questa configurazione da qualsisasi PC faccia il PING non riesco ad avere risposta dal Router 3. Chiaramente Pingo al IP della scheda WIFI e cioè 192.168.1.3 (rilasciato in automatico). Per il discorso del Gateway, il router 2 ha IP statico ed il Gateway in tutti gli Host siano XP , Linux o openwrt deve essere per forza quello dell'AGIF altrimenti non ho accesso a internet. Non sei d'accordo?
    Anche dal telefonino se il Gateway non è quello dell'AGIF non ho connessione a internet. Almeno per esperienza è quello che ho riscontrato sempre.
    fammi sapere la tua

    ciao Peppe









    RispondiElimina
    Risposte
    1. il fatto è questo, il tuo router2 è come il mio, prende il segnale dell'eth dal modem di casa, e lo ributta sul proprio wifi ed eth. la differenza è che, i pc collegati ad esso via eth ottengono un ip rilasciato dal modem di casa, quindi sono nella stessa sottorete del router, mentre chi vi si connete wifi, ottiene un ip rilasciato dal 2 router, cioè si trova in uan sottorete. quindi io metterei il client wifi con gateway router2.

      Elimina
  4. ma cosí non avrei accesso ad internet! o no? almeno questo è quello che mi succede.
    non mi torna neanche quello che mi dici, nel senso che il router 2 assegna un IP della stessa sottorete al router 3(192.168.1.3).
    appositamente ho disabilitato i DHCP in modo che sia sempre l'AGIF a rilasciare l'IP. Questo perche do per scontato che chi rilascia l'IP da anche il Gateway. infatti succedeva che se abilito il DHCP sul router 2 chiunque si connetta riceva come gateway il suo IP, in questo modo non ha accesso a internet.
    sicuramente trascuro qualcosa o c'è qualcosa che ignoro.
    fammi sapere se c'è qualcosa che non va nel mio ragionamento
    ciao

    RispondiElimina
    Risposte
    1. ok. mettiamo da parte questo discorso x il momento. il tuo problema di non poter accedere alla shell del router3, secondo me è dovuto ad un'impostazione errata del firewall. del router 1 o 2. c'è un'altra prova che devi fare, è complicata ma utile. usando python
      crei un programma server e uno client, esempio. il server parte e si mette in ascolto su una porta. attende la connessione di un client, di questo stampa l'ip, poi attende di ricevere una stringa e la reinvia duplicata. esempio ricevo "ciao", reinvio "ciaociao". il client è quello che si connette al server, invia la stringa, e attende la risposta.
      con questi 2 programmi fai 2 prove: metti il client in autoastart sul router2, il server in ascolto sul tuo, accendi il router e verifichi di ricevere la stringa, questo dimostra il router3 comunica in uscita.
      invertendo i programmi proverai se il router riceve connessioni.
      tutto chiaro? pensi di poterlo fare? se vuoi posso passarti i file appena mi libero

      Elimina
  5. ferma ferma ... stai andando sul difficile .
    Stai dicendo che devo fare un piccolo programma con Python ?
    Le cose si complicano ho paura di non arrivare al risultato che mi chiedi, nel senso che prima di arrivarci dovrò risolvere altri problemi sul percorso dovuti al fatto che non ho mai usato Python ... Sono solo un ex programmatore Pascal arruginito.
    Se ritieni che sia l'unica soluzione posso provare a cimentarmi.
    Se pensi che sia un problema di firewall non si potrebbe semplicemente disabilitrare tutti i firewall ? Intanto senza sapere come funzionano io ho impostato tutti i permessi con "ACCEPT"
    Ripeto se pensi sia una prova indispensabile da fare ci provo... ma mi devi dare una mano appena ti è possibile.
    Grazie intanto
    Ciao



    RispondiElimina
    Risposte
    1. tranquillo non è difficile, ti passo io tutti i file, a te basta installare python.
      per il momento è l'unico modo sicuro di fare il test che mi viene in mente. se hai gia settato tutto su accept..

      Elimina
  6. Visto che ho poco spazio su gli altri Router posso usare XP per l'altro "python". ?
    Ho incominciato ad installare python sul Router 3 , e prende molto spazio, se uso python su di un XP la prova dovrebbe funzionare allo stesso modo.
    Corretto?

    RispondiElimina
  7. credevo di averlo spcificato, certo che puoi usare il pc.
    per il router se usi una penna usb montata per metterci python sopra è meglio, mi pare che occupi 20mega, molto aldilà dello spazio disponibile. i file te li posso preparare martedi, xkè ho da dare un esame. nel frattempo aggiungimi su facebook

    RispondiElimina
  8. So che oggi hai cercato di contattarmi... purtroppo torno abbastanza tardi dal lavoro ed in settimana difficilmente riesco ad avere un po di tempo libero.
    cmq ti volevo informare che in effetti domenica sera sono riuscito ad installare python sull AGPF n°3 senza usare alcuna chiavetta. ha occupato 4/5 Mb ma ho quasi riempito la flash. Pensi che riusciro a compilare/interpretare il programmino che mi manderai?
    Viceversa come si farebbe eventualmente ad installare programmi sulla Pen drive USB ?

    RispondiElimina
    Risposte
    1. è di una semplicità incredibile. le istruzioni èer installare python su penna usb le trovi in questo altro mio articolo: http://latanadelgurzo.blogspot.it/2012/12/arduino-e-openwrt-accensione-led-da.html
      se riesci a contattarmi ti spiego tutto mano a mano, altrimenti dimmelo ke ti preparo un file con le istruzioni

      Elimina
  9. Eccomi di nuovo,
    ho fatto come dicevi tu , anche se, come ti avevo accennato ero riuscito ad installare python senza USB occumando solo 5Mb.
    seguendo la tua Guida, dopo averlo disinstallato dalla Flash , l'ho installato sulla penna USB. Ho ricevuto però un messaggio di errore che non riesco a valutare. ecco il log :

    root@OpenWrt:/# opkg install -d penna python pyserial
    Installing python (2.6.4-3) to penna...
    Downloading http://downloads.openwrt.org/backfire/10.03.1/brcm63xx/packages/pyth on_2.6.4-3_brcm63xx.ipk.
    Installing python-mini (2.6.4-3) to penna...
    Downloading http://downloads.openwrt.org/backfire/10.03.1/brcm63xx/packages/pyth on-mini_2.6.4-3_brcm63xx.ipk.
    Installing pyserial (2.4-1) to penna...
    Downloading http://downloads.openwrt.org/backfire/10.03.1/brcm63xx/packages/pyse rial_2.4-1_brcm63xx.ipk.
    Configuring python-mini.
    Configuring python.
    Configuring pyserial.
    Collected errors:
    * extract_archive: Cannot create symlink from ./usr/bin/python to 'python2.6': Operation not permitted.
    root@OpenWrt:/# root@OpenWrt:/# opkg install -d penna python pyserial


    ho controllato lo spazio occupato sulla chiavetta e sono solo 10Mb circa.
    Parallelamante ho installato un Python su un PC.
    Per cmpletezza ti ho inviato uno schema della mmia LAN su FB.

    Adesso... un passettino alla volta ... anche perchè purtroppo non ho molto tempo
    dimmi il prossimo passo da fare
    ciao



    RispondiElimina
  10. l'errore probabilmente è dovuto ad alcuni file che non sono stati correttamente cancellati durante la disinstallazione. comunque visto che era solo per fare questa prova, potevi lasciare anche come stava. ti ho spedito i file

    RispondiElimina
  11. Volevo dare un piccolissimo contributo al tuo blog, per chi, come noi, trova piacere a smanettare con OpenWRT+webcam.
    Girando per la rete ho cercato senza trovare riscontro ma provando e riprovando ho scoperto che è possibile utilizzare ID e PSW con Mjpg-streamer per l'accesso.
    Bisogna aggiungere al file di configurazione in ETC/CONFIG la seguente riga :

    option password "utente:password"

    e poi aggiungere nel file di configurazione in /ETC/INIT.D nella riga

    [ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so

    la voce : -c $password

    nel mio file ho anche la voce : --port $port ma forse per default il numero della porta è già 8080.

    Spero sia di aiuto a qualcuno.





    RispondiElimina
    Risposte
    1. si ankio ho impostato dei dati per l'accesso, se ti interessano altre personalizzazioni c'è un link in fondo al mio articolo ;)

      Elimina
    2. Salve a tutti, sto testando la PS3 Eye Webcam su OpenWRT 12.07.
      Il dispositivo viene montato correttamente, ma il frame rate che ottengo con FFmpeg a risoluzione piena (640x480) è di soli 3 fps.
      La stringa che do è questa:
      ffmpeg -f video4linux2 -r 25 -i /dev/video0 /tmp/video.flv

      Dove sbaglio?

      Elimina
    3. secondo me non sbagli, il problema è la memoria disponibile. io con la mia a tipo 320x240, non potevo andare oltre i 5 fps, altriemnti avevo un ritardo anche di 5 secondi.
      secondo me la qualità dell'immagine della ps3 eye, unita alla risoluzione che hai scelto. non ti permettono di avere 25 fps.
      scoprirlo è facile, dimmi quanti bit di colori ha la cam

      Elimina
    4. Aggiornamento:
      ho provato ad utilizzare motion anzichè FFMPEG con risoluzione 320x240 e va a 25 FPS senza esitazioni su web streaming mentre a 640x480 mi crasha.....purtroppo non sono espertissimo di elaborazione video e non riesco a capire se il framerate dipenda dalla "bravura" del programma nell'interfacciarsi con il driver video oppure dal supporto di memorizzazione scelto (con Motion non memorizzo nulla scarico sulla porta 8080, mentre con FFMpeg vado a scrivere su file).

      Elimina
    5. sicuramente la scrittura su file è molto molto molto più onerosa per openwrt

      Elimina
  12. Ciao, ho provato a seguire la guida usando come dispositivo un arduino yun. Tuto perfetto per le foto ma quando cerco il video collegandomi dall interno della Lan il browser mi restituisce "ReadResponse() failed: The server did not return a response for this request. " Secondo te da cosa dipende?? Grazie mille e complimenti per il blog

    RispondiElimina
  13. Ho una webcam un po vecchia che non riesco a far funzionare.
    il System Log mi dice:
    [ 1668.380000] usb 1-1: new full-speed USB device number 4 using ehci-platform
    [ 1668.540000] usb 1-1: New USB device found, idVendor=093a, idProduct=2468
    [ 1668.540000] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [ 1668.550000] usb 1-1: Product: CIF Single Chip
    [ 1668.550000] usb 1-1: Manufacturer: Pixart Imaging Inc.
    Ho provato sia con kmod-video-uvc e con il kmod-video-gspca-core ma in entrambi i casi non riesco a farla funzionare. Qualche consiglio utile?
    Grazie mille Paolo

    RispondiElimina