Camera : Record + Live en simultané sans perte

Salut, Je cherche un moyen de pouvoir regarder ma caméra Pi et de l’enregistrer en direct, sans delay. La lecture et enregistrement doit ce faire via la même machine, alors inutile de créer un serveur pour le stream. Le projet est pour une dashcam.

Je tente de le faire et d’avoir un usage CPU minimum. La résolution de mon écran est de 800x480 (LCD 5") et je crois que du 720x480 pour le USB (arrière) et 1280x720 pour la Pi Camera (Avant) serais la résolution à choisir pour un équilibre de qualité/performance. Les deux en 24~25fps.

Les quelques solutions que j’ai trouvé marche mais pas comme je veux, car il utilise le principe d’un serveur pour le stream out et un client est requis pour le lire. Ceci cause un délais de quelques secondes, pas pratique pour le stationnement.

La commande est celle-ci:
raspivid -o - -t 0 | tee test_video.h264 | cvlc --no-audio -v stream:///dev/stdin --sout '#standard{access=http,mux=ts,dest=:8080' :demux=h264

Alors comment faire un live+record sans délais pour le live ?
Si vous avez des bout de script Python dans ce genre, je suis preneur :slight_smile:


Note 1:
La je fais les tests, les lignes de commande sont pour tester les performances, la solution devra également marcher via un code Python, car je songe a créer une interface. La caméra USB (arrière) est toujours active.


Note 2:
Ma configuration actuelle est un écran 4.5" analogique qui recois ma caméra de recul, je veux créer ma Dashcam et relier la caméra de recul pour enregistrer les 2. AVec l’idée du projet actuel, l’écran sera remplacé par celle du Pi (LCD 5"+Touch).

SI il est trop « couteux » en ressource de faire comme cette idée (2 input=>record+live en 2 process), est de faire du Pi un simple enregistreur de données (avec un écran 3.5" et affichage simple de l’état). L’écran actuel analogique restera, le signal de la camera sera plutot divisé (« Y »).


Note 3:
J’ai sous la main les Raspberry Pi suivant; Pi 1B, Pi3B et Pi0WH. Je souhaite effectuer le travail à un Pi0 (plus fort que mon Pi1, mais moins que le Pi3).

Ajout: Je vais avoir besoin d’un example de code pour intégrer une video vlc dans une interface GTK. Je ne crée pas l’élément « on the fly », mais je veux placer l’lément dans mon design et l’utiliser. J’ai cru comprendre que c’est avec un « DrawArea » mais le code plante à la capture du ID pour l’instance.

Voici des sources trouvés;

Fouillé un peu dans https://www.programcreek.com/python/example/93375/vlc.Instance

Je pense avoir trouvé une solution partiel. Si je passe via le « raspivid » je peux outrepasser le design (car avec « -preview » je peux placer un live sur l’écran). Un petit script pour encoder sous mp4 et un loop, et c’est dans la boite;

front.sh

#!/bin/bash
while :
do
	filename=front-$(date +"%y%m%d-%H%M%S")
	raspivid -fl -t 30000 -w 1280 -h 720 -p 10,10,360,240 -o /home/pi/piDashcam/$filename.h264
	nohup sh ./encoder.sh $filename >/dev/null 2>&1 &
done

encoder.sh

#!/bin/bash
MP4Box -add /home/pi/piDashcam/$1.h264 /home/pi/piDashcam/$1.mp4 >/dev/null 2>&1 &
rm -f /home/pi/piDashcam/$1.h264 

Maintenant, si je peux trouver un code semblable pour la caméra USB et j’ai déjà ma base idéal. Après resterais à trouver moyen d’y ajouter des timestamp, mais je nomme les fichiers avec leur date, c’est déjà bien.

Pour les curieux, voici ce que donne les fichiers en final dans le dossier du Pi;
Screenshot_2


Edit 1:
Pour avoir la date et l’heure, il faut changer la ligne du RaspiVid pour celle ci:
raspivid -fl -t 30000 -w 1280 -h 720 -p 10,10,180,120 -ifx none -awb auto -a 12 -a 1024 -a "Front %Y-%m-%d %X" -ae 40,0x00,0x8080ff -o /home/pi/piDashcam/$filename.h264

Détails des paramètres;

  • -a 12 : Pour définir les variables %
  • -a 1024 : Ont veux un background
  • -ae 40,0x00,0x8080ff : Pas sur exactement des valeur (pris d’un forum) mais le 40 est la taille du texte (en pixel !?)

Voici un résultat intéressant.

Démarrage sur un Raspberry Pi 1B avec une caméra Pi 8MPx

  • Démarrage du Pi sur Raspbian Lite
  • Pas de logon, les services démarre;
  • Encoder : Lance les encodage des fichiers précédents non encodé, comme ceux en fin prématuré
  • Camera : Lance l’enregistrement en 1280x720, avec Preview. Segmenter en 300secs (5 mins)
  • USBCopy : Un script en loop (pause 10s si rien détecté) qui s’occupe de détecter la clé USB pour copier les fichier;
    • Insert la clé USB en NTFS, le script va le détecter et le monter (icon:disquette avec engrenage, coin droit)
    • Si des MP4 sont disponibles, les fichiers sont copier sur la clé USB (move) (icon:laptop avec flèche rouge)
    • Une fois la copie fini, il le démonte (icon:disquette avec engrenage)
    • Il est possible de débrancher la clé USB durant 60s (1minute) avant de relancer la procédure (au lieu du 10s)
  • La fermeture est à chaud (direct off), aucun bouton pouvant faire ceci (car le conducteur pensera pas de fermer proprement le OS)

Alors il marche plus ou moins comme une vraie Dashcam, il ce connect à l’écran qui sert déjà à l’écran de recule (4.5", double entrée, RCA).

La copie des fichiers peut ce faire via le USB, chaque vidéo prend en moyenne 2 minutes à être copier (USB 2.0) ou plus vite avec le USB 3 (disque mSATA) même si le RPi1 n’est pas « USB 3 Ready ». La méthode d’auto-detect a été conçu pour un usage simple, vu que l’utilisateur premier n’est pas moi, et qui n’est pas nécessairement « suiveux » des méthodes. Sinon je peux prendre le RPi et le connecter à mon réseau, j’accède au partage Samba facilement (déjà config) et ainsi copier rapidement, si beaucoup de fichier.

Le OS est sur une microSD de 64GB Class 10 Lexar.