Enregistrement de videos avec picamera


#1

Bonjour,

Je voudrais savoir comment on fait pour enregistrer une vidéo dans un répertoire bien précis et non dans le répertoire Downloads. Voici mon code, où est-ce que je pourrais insérez la commande pour le faire ?

#!/usr/bin/env python

-- coding:Utf-8 --

import time
import picamera
import RPi.GPIO as GPIO
import os

camera = picamera.PiCamera()
camera.resolution = (1920,1080)
#camera.vflip = True
GPIO.setmode(GPIO.BOARD)
Capteur = 26
DureeVideo = 30
NombreVideos = 0
GPIO.setup(Capteur,GPIO.IN)

try:
print(“Presser Ctrl+C pour arrêter le programme”)
time.sleep(10)
print(“Le programme est opérationnel”)
while 1:
if (GPIO.input(Capteur) == 1):
NomVideo = “Video{}".format(NombreVideos) + time.strftime("%d-%m-%Y%Hh%Mm%Ss”)
print(“Rec…”)
camera.start_recording(NomVideo+".h264")
time.sleep(DureeVideo)
camera.stop_recording()
print(“Vidéo terminée”)
NombreVideos += 1
Commande = “MP4Box -add ~/Desktop/projet1A/”+ NomVideo + ".h264 " + “~/Desktop/projet1A/” + NomVideo + “.mp4”
os.system(Commande)
print(“Nombre de vidéos réalisées depuis la mise en route du système : {}”.format(NombreVideos))
time.sleep(3)
else :
time.sleep(0.1)

except KeyboardInterrupt :
print(“Programme interrompu”)
GPIO.cleanup()

Merci pour toute aide que vous pourrez m’apporter !


#2

Salut,

A l’arrach’ en passant.
Et si tu testais avec :
os.system('raspivid -o /home/pi/dossier/sous-dossier/video.mp4')
(et les options voulus)
++


#3

Merci pour la réponse.

Mais est-il vraiment possible d’enregistrer directement en format mp4 ? Il me semble que les fichiers vidéos de la caméra sont en .h264


#4

Par contre j’ai essayé plusieurs variantes de ce code mais rien ne marche… Il existerait pas un autre moyen de le faire sans utiliser une commande os ? Parce quand je veux prendre une vidéo avec ça il m’affiche plein de messages d’erreurs, alors qu’avec mon ancien code, il n’y avait aucun soucis pour prendre la vidéo, juste je ne pouvais pas choisir la destination de la vidéo


#5

J’ai tapé une idée de code.
Faut vérifier l’usage de Raspivid (je n’utilise pas)
et je ne suis pas codeur.
Je n’ai même pas appris le python.
Tu as vérifié le code sous Geany (genre pb d’indentation ?)
Le script de photomaton que j’ai largement modifié utilise une commande os.system sans souci.

Tu as forcément une solution sans os.system

Tu pourrais définir le chemin dans une #def ou l’écrire dans le script ou exécuter ton code dans le dossier où tu veux obtenir les vidéos (je pense).

Je vais tenter de regarder ça pour de vrai.


#6

Il n’y a aucun problème d’indentation je suis assez maniaque là-dessus.
Le problème avec le fait de juste faire tourner mon code dans le dossier destination est que je vais avoir pour chaque vidéo une version en .h264 et une autre en .mp4, donc j’aurais voulu séparer les fichiers directement dans mon code pour qu’ensuite en allant récupérer les vidéos je n’aie qu’à prendre les formats mp4 et supprimer es formats h264 car inutiles après.
Merci beaucoup ce serait top.


#7

Je viens de retravailler le code et virer plein d’erreurs (put-être liées au passage sur le forum).

pi@raspberrypi:~ $ python3 /home/pi/test/script.py 
Presser Ctrl+C pour arrêter le programme
Le programme est opérationnel
Rec…
Traceback (most recent call last):
  File "/home/pi/test/script.py", line 26, in <module>
    camera.start_recording(NomVideo+".h264")
NameError: name 'NomVideo' is not defined

raspivid -w 640 -h 480 -o video.mp4 -t 1000 -fps 24
ne donne rien
raspivid -w 640 -h 480 -o video.h264 -t 1000 -fps 24
donne une vidéo
On a donc la réponse objective.


#8

D’accord merci pour l’aide


#9
pi@raspberrypi:~/test $ python3 /home/pi/test/script.py 
Presser Ctrl+C pour arrêter le programme
Le programme est opérationnel
Rec…
Vidéo terminée
Nombre de vidéos réalisées depuis la mise en route du système : 1
Rec…
Vidéo terminée
Nombre de vidéos réalisées depuis la mise en route du système : 2
Rec…
Vidéo terminée
Nombre de vidéos réalisées depuis la mise en route du système : 3
Rec…
Vidéo terminée
Nombre de vidéos réalisées depuis la mise en route du système : 4
Rec…
^CProgramme interrompu

Mais je n’ai aucune vidéo
(J’ai viré la partie du code qui transcode.)

#!/usr/bin/python3
# -*- coding: utf-8 -*

import time
import picamera
import RPi.GPIO as GPIO
import os

camera = picamera.PiCamera()
camera.resolution = (1920,1080)
#camera.vflip = True
GPIO.setmode(GPIO.BOARD)
Capteur = 26
DureeVideo = 30
NombreVideos = 0
GPIO.setup(Capteur,GPIO.IN)

try:
	print('Presser Ctrl+C pour arrêter le programme')
	time.sleep(10)
	print('Le programme est opérationnel')
	while 1:
		if (GPIO.input(Capteur) == 1):
			NomVideo = "Video{}".format(NombreVideos) + time.strftime("%d-%m-%Y%Hh%Mm%Ss")
			#NomVideo = "test-video"
		print("Rec…")
		camera.start_recording('NomVideo'+'.h264')
		time.sleep(DureeVideo)
		camera.stop_recording()
		print("Vidéo terminée")
		NombreVideos += 1
		#Commande = "MP4Box -add ~/Desktop/projet1A/"+ NomVideo + ".h264 " + "~/Desktop/projet1A/" + NomVideo + ".mp4"
		#os.system(Commande)
		print("Nombre de vidéos réalisées depuis la mise en route du système : {}".format(NombreVideos))
		time.sleep(3)

except KeyboardInterrupt :
	print("Programme interrompu")
	GPIO.cleanup()

#10

Il ne faut pas mettre NomVideo entre guillemets dans le start_recording, car NomVideo est déjà de type str, et en la mettant juste comme ça suivi de .h264, le nom sera bien et sera surtout différent à chaque fois, parce que là le programme prend plusieurs fois une vidéo avec le même nom


#11

Ha oui, c’était lors de mon premier test pour vérifier que ça tournait et enregistrait :slight_smile:


#12

Désolé, pas mal occupé ce soir.

Par principe, je viens de taper ça :

#!/usr/bin/python3
# -*- coding: utf-8 -*

import time
import os

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 10000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 10000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)

ça fonctionne.
Donc la commande fonctionne (je voulais être sûr :wink: )

Edit :
Et un petit dernier pour le fun :

#!/usr/bin/python3
# -*- coding: utf-8 -*

import time
import os

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

Je me retrouve bien avec 3 vidéos .h264 et 3 vidéos .mp4

test-script

Edit 3 :
J’étais parti faire autre chose … une idée toute bête
os.system('rm *.h264')

Du coup :

#!/usr/bin/python3
# -*- coding: utf-8 -*

import time
import os

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

fileName = time.strftime("%Y%m%d-%H%M%S")+".h264"
os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'"')
time.sleep(3)
os.system('ffmpeg -i "/home/pi/test/'+fileName+'" "/home/pi/test/'+fileName+'".mp4 -y')

os.system('rm *.h264')

J’ai donc (pas de boucle)

  • Une première vidéo .h264 puis sa transformation en .mp4
  • Une seconde vidéo .h264 puis sa transformation en .mp4
  • Une troisième vidéo .h264 puis sa transformation en .mp4
  • La suppression de toutes les vidéos en .h264

#13

Boucle infinie et travail plus propre

Je fais une boucle (simple pour le moment)

  • Une première vidéo en .h264
  • Puis sa transformation en .mp4
  • La suppression du fichier en .h264
    –> On recommence

#!/usr/bin/python3
# -*- coding: utf-8 -*

import time
import os

while True :
	fileName = time.strftime("%Y%m%d-%H%M%S")
	os.system('raspivid -w 640 -h 480 -t 5000 -fps 24 -o "/home/pi/test/'+fileName+'".h264')
	time.sleep(3)
	os.system('ffmpeg -i "/home/pi/test/'+fileName+'.h264" "/home/pi/test/'+fileName+'".mp4 -y')
	os.system('rm *.h264')

Espérant que ces pistes (et ces test/jeux/apprentissages pour moi qui ne connait pas le python) puissent te servir.

++