FFMEPG : timelapse, écrase les images

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
lensemble
Messages : 3
Enregistré le : jeu. 23 juin 2022 19:22

FFMEPG : timelapse, écrase les images

Message par lensemble » jeu. 23 juin 2022 19:38

salut,

je suis en train de faire un timelapse avec mon RPI en python

Pour effectuer les prises d'images et les ranger dans des dossiers : Zero PB
Mais pour créer une vidéo avec FFMPEG j'ai un soucie.

Au bout de X images, le scripte lance la création d'une video.
il en résulte une vidéo avec uniquement la première image ET il écrase toutes les images du dossier par la première image (?!)
Pas de message d'erreur

Que fais je donc de mal ?

Merci

---
le ligne pour FFMEPG :

Code : Tout sélectionner

system('ffmpeg -f image2 -framerate 1 -pattern_type glob -start_number %d -i /media/julien/USBKEY/capture_%d/%d/*.jpg -r 5 -c:v libx264 -pix_fmt yuv420p /media/julien/USBKEY/capture_%s/%d/out%d.mp4 -y' %( nom_premiere_image, nom_dossier, nom_sous_dossier, nom_dossier, nom_sous_dossier, nom_sous_dossier))

L'ensemble du scripte :

Code : Tout sélectionner

from picamera import PiCamera
from time import sleep
from time import time 
from os import system
import RPi.GPIO as GPIO
import os
from PIL import Image # pour visioner
import subprocess # pour permettre de cloturer le viewer

import ffmpeg

camera = PiCamera()
camera.resolution = (720,640)

#variables
temps_entre_photo_voulu = 1 # si <= 4sec  : relais tjrs allumé . cette variable est en lien avec le relais et donc ne peut être < à 1
photos_par_dossier = 4 # nbre de photos par dossier

creation_gif = True # pour 100 photos dans un dossier le RPI met +/- 50 sec 
vitesse_image_gif = 1 # temps_apparition des images du GIF ou framerate pour FFMPEG

lumiere = True # actionner le relais

viewer = True # montre la photo prise

#constantes
temps_avant_lancement=3# mettre10sec si en boot (laisse le temps de monter le MEDIA si programme au boot du RPI)
relay=17
temps_relais=0.5

#ne pas modifier
temps_calcul= temps_entre_photo_voulu-(2*temps_relais)
photos_prises=0
GPIO.setmode(GPIO.BCM)
GPIO.setup(relay, GPIO.OUT)
GPIO.setwarnings(False)
nom_dossier=int(time())
nom_image=nom_dossier
nom_premiere_image=nom_image+1
nom_sous_dossier=0

#info console
print("Temps entre prise photos :", temps_entre_photo_voulu,"sec")
print("Mode creation GIF : ", creation_gif)
print("Nbre de photos par dossier :", photos_par_dossier)
print("Lancement dans",temps_avant_lancement, "secondes")

#test lumiere
if lumiere : 
    GPIO.output(relay, GPIO.LOW)
        
sleep (temps_avant_lancement)#important si programme en boot : le temps de le MEDIA soit monté 

os.makedirs('/media/julien/USBKEY/capture_%s' % nom_dossier)#creation du dossier parent

print("La boucle demarre")

while 1:
    # si pas de photo prise (== nouveau cycle) alors création d'un dossier pour ce nouveau cycle
    if photos_prises == 0 :
        nom_sous_dossier += 1
        os.makedirs('/media/julien/USBKEY/capture_%s/%d' %(nom_dossier, nom_sous_dossier))
        print("creation d'un sous_dossier n°", nom_sous_dossier)
        sleep(1)
    # si nbre prises < nbre photos par dossier alors prise d'une photo
    if photos_prises < photos_par_dossier :
        if lumiere : 
            GPIO.output(relay, GPIO.LOW)
        sleep(temps_relais) #lancer meme si relais off car est pris en compte dans l'interlude entre photos 
        nom_image+=1
        camera.capture('/media/julien/USBKEY/capture_%d/%d/%d.jpg' %(nom_dossier, nom_sous_dossier,nom_image))# indiquer image+date
        #lance un viewer avec la photo prise
        if viewer :
            p = subprocess.Popen(['display', '/media/julien/USBKEY/capture_%d/%d/%d.jpg' %(nom_dossier, nom_sous_dossier,nom_image)])
        sleep(temps_relais) # idem
        
        #si temps entre photo <= 4 sec alors reste allumé
        if temps_entre_photo_voulu > 4 and lumiere :
            GPIO.output(relay, GPIO.HIGH)
        
        photos_prises += 1

        print("photo prise n°", photos_prises,"/", photos_par_dossier," avant nouveau cycle (+ crea GIF si actionné)")
        sleep(temps_entre_photo_voulu)
        
        #ferme le viewer
        if viewer :
            p.kill()

    else:
        #si on dépasse le nbre de photo par dossier
        photos_prises=0
        #creation gif
        if creation_gif :
            var_temps=int(time())
            print("Creation du mp4 n°", nom_sous_dossier)
      #     system('convert -delay %f -loop 0 /media/julien/USBKEY/capture_%s/%d/image*.jpg /media/julien/USBKEY/capture_%s/%d/animation%d.gif' %(vitesse_image_gif, nom_dossier, nom_sous_dossier, nom_dossier, nom_sous_dossier, nom_sous_dossier))
            system('ffmpeg -f image2 -framerate 1 -pattern_type glob -start_number %d -i /media/julien/USBKEY/capture_%d/%d/*.jpg -r 5 -c:v libx264 -pix_fmt yuv420p /media/julien/USBKEY/capture_%s/%d/out%d.mp4 -y' %( nom_premiere_image, nom_dossier, nom_sous_dossier, nom_dossier, nom_sous_dossier, nom_sous_dossier))
                        
            var_temps=int(time())-var_temps
            print("animation_gif_faite en ",var_temps,"sec")
        print("Dossier " , nom_sous_dossier, "terminé")
Modifié en dernier par lensemble le ven. 24 juin 2022 10:26, modifié 3 fois.

piper
Raspinaute
Messages : 641
Enregistré le : sam. 5 juin 2021 18:57

Re: FFMEPG : timelapse, écrase les images

Message par piper » jeu. 23 juin 2022 22:12

Bonjour,
Tu devrais utiliser le bouton </> du site pour mettre ton code, il sert à ça
Car, tu le sais, les bloc d'instructions dans python sont identifiables par des tabulations (ou indentation) , hors, ici tout est aligné à gauche.
Le code est donc incompréhensible sauf a deviner quelques indentations il faut mettre et où
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

lensemble
Messages : 3
Enregistré le : jeu. 23 juin 2022 19:22

Re: FFMEPG : timelapse, écrase les images

Message par lensemble » jeu. 23 juin 2022 22:57

je cherchais en effet à le faire mais n 'avais et n'ai tjrs pas trouvé où cela se trouve ...

mais a priori le pb se trouve dans la ligne systeme(etc)

lensemble
Messages : 3
Enregistré le : jeu. 23 juin 2022 19:22

Re: FFMEPG : timelapse, écrase les images

Message par lensemble » ven. 24 juin 2022 09:10

merci à l'admin d'avoir mis en forme le code j ai pu voir comment faire via [code]

piper
Raspinaute
Messages : 641
Enregistré le : sam. 5 juin 2021 18:57

Re: FFMEPG : timelapse, écrase les images

Message par piper » sam. 25 juin 2022 00:46

Bon là comme ça, il faudrait que je ré-installe une caméra sur mon pi pour tester.

Je peux donner le conseil que tout développeur applique qu'il soit étudiant ou avec 30 ans d'expérience :
Lorsqu'un problème de ce type arrive , on effectue des tests ex :
1 - faire un print de ta commande d'appel à ffmpeg serait pas mal parce qu'il y a un paquet de nom_dossier, nom_sous_dossier qui, j'ai vu, ne sont pas des noms mais des numéros, ça permettra de voir si un truc ne te saute pas au yeux car c'est toi qui a imaginé l'arborescence (un peu compliquée au premier regard pour quelqu'un qui vient de l'extérieur)
2 - faire une simulation : tu te stockes quelques fichiers images et tu lances la commande ffmpeg à la main telle qu'elle serait dans l'exécution
ça te permettra de voir si ta syntaxe est correct par rapport à ce que tu souhaites.

Si j'ai un peu de temps, je reconnecterai ma caméra pour essayer.
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: FFMEPG : timelapse, écrase les images

Message par jelopo » sam. 25 juin 2022 12:42

Bonjour,

vraisemblablement c'est une erreur de format ou d'arguments dans la commande ffmpeg ?

comme le suggère @piper commencer par ajouter ceci juste avant la ligne "system 'ffmpeg..." dans le script:

Code : Tout sélectionner

print "ffmpeg -f image2 -framerate 1 -pattern_type glob -start_number %d -i /media/julien/USBKEY/capture_%d/%d/*.jpg -r 5 -c:v libx264 -pix_fmt yuv420p /media/julien/USBKEY/capture_%s/%d/out%d.mp4 -y" %( nom_premiere_image, nom_dossier, nom_sous_dossier, nom_dossier, nom_sous_dossier, nom_sous_dossier))
Et vérifier que la commande ffmpeg correspond exactement à ce qui est souhaité.

A+

piper
Raspinaute
Messages : 641
Enregistré le : sam. 5 juin 2021 18:57

Re: FFMEPG : timelapse, écrase les images

Message par piper » sam. 25 juin 2022 19:21

Je confirme, après test chez moi c'est la commande
ffmpeg -f image2 -framerate 1 -pattern_type glob -start_number 1656175654 -i /home/pi/capture_1656175653/1/*.jpg -r 5 -c:v libx264 -pix_fmt yuv420p /home/pi/capture_1656175653/1/out1.mp4

qui ne va pas (j'ai mis mon dossier perso)

fais un print de ta commande et lances là en test

Tu vas constater que ffmpeg veux remplacer tes images (je pense qu'il commence par les convertir en 420p)
Et tu te retrouves avec n images :
la 1ère contient tout (y compris les données EXIF, elle sert de clé pour la vidéo)
les autres semblent être des clones de la 1ère sans EXIF

Je ne suis pas un pro de ffmpeg qui est une usine à gaz qui sait faire énormément de chose.
Tu dois commencer par mettre cette ligne de commande au point sans avoir besoin de toucher à ton code
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

Répondre

Retourner vers « Python »