IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

PyQt5 - Enregistrer le flux de la webcam


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut PyQt5 - Enregistrer le flux de la webcam
    Bonjour,

    J'essaie d'écrire une appli qui permet d'enregistrer le flux de ma webcam.

    J'écris d'abord un composant Viewer pour ma webcam :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class cameraViewer(QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.online_webcams = QCameraInfo.availableCameras()
            if not self.online_webcams:
                pass  # quit
            self.exist = QCameraViewfinder()
            self.exist.show()
     
            self.layout = QHBoxLayout()
            self.layout.addWidget(self.exist)
     
            self.get_webcam(0)
     
            self.setLayout(self.layout)
     
     
        def get_webcam(self, i):
            self.my_webcam = QCamera(self.online_webcams[i])
            self.my_webcam.setViewfinder(self.exist)
            self.my_webcam.setCaptureMode(QCamera.CaptureVideo)
            self.my_webcam.error.connect(lambda: self.alert(self.my_webcam.errorString()))
            self.my_webcam.start()
     
     
        def start(self):
            self.recorder = QMediaRecorder(self.my_webcam)
            self.recorder.setOutputLocation(QUrl.fromLocalFile("D:/chemin/vers/mon/fichier/video/test.mp4"))
            self.recorder.record()
     
        def stop(self):
            self.recorder.stop()
     
        def alert(self, s):
            err = QErrorMessage(self)
            err.showMessage(s)
    Et dans mon module principal, j'ai le code de mon appli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class myMainWindow(QMainWindow):
        # Constructeur
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.setCentralWidget(QWidget(parent=self))
     
            self.cameraViewer = cameraViewer()
            self.mainLayout = QHBoxLayout(self.centralWidget())
            self.mainLayout.addWidget(self.cameraViewer, stretch=0)
     
            self.__createToolBar()
     
     
        def __createToolBar(self):
            toolbar = QToolBar("My main toolbar")
            self.addToolBar(toolbar)
            self.record_start = QPushButton('start')
            self.record_start.clicked.connect(self.cameraViewer.start)
     
            self.record_stop = QPushButton('stop')
            self.record_stop.clicked.connect(self.cameraViewer.stop)
     
            toolbar.addWidget(self.record_start)
            toolbar.addWidget(self.record_stop)
    Quand je clique sur le bouton start, je n'ai pas d'erreur, mais le fichier video n'est pas crée.
    Pourquoi?

    Merci,
    Nico

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Je n'ai jamais essayé, mais j'ai cherché sur le web par curiosité. Si c'est sous Windows, il semble que l'enregistrement ne marche pas:

    https://doc.qt.io/qt-5/qtmultimedia-windows.html

    Peut-être avec PyQt6 ?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par DiverSIG Voir le message
    Quand je clique sur le bouton start, je n'ai pas d'erreur, mais le fichier video n'est pas crée.
    Pourquoi?
    Déjà la première chose serait de vérifier que self.online_webcams est ou n'est pas vide. Parce que tu fais un test sur cette possibilité mais le test ne mène sur rien. Chez-moi par exemple (je n'ai pas de cam) la liste est vide.
    Ensuite cette fonction suppose te retourner la liste de toutes les caméras de ton système (ok tu peux en avoir plusieurs) mais tu appelles ensuite la camera(0). Pourquoi 0? Parce que tu n'en as qu'une évidemment. Mais dans ce cas pourquoi récupérer toute la liste de ta seule caméra alors que tu peux utiliser defaultCamera() à la place ?

    Ensuite si record() échoue, tu reçois un signal error() et ton mediaRecorder passe en état StoppedState. Peut-être tu peux vérifier la présence de ce signal en le connectant à un slot (tu as connecté le signal error() de ta camera et non pas le signal error() du mediaRecorder) ainsi que cet état via self.recorder.state()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Ma fonction start():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        def start(self):
            self.recorder = QMediaRecorder(self.my_webcam)
            self.recorder.error.connect(lambda: self.alert(self.recorder.errorString()))
            self.recorder.setOutputLocation(QUrl.fromLocalFile("D:/Nicolas/AWDRONE/ROV/dev/ROVPilot_v2/test.mp4"))
            try:
                settings = self.recorder.videoSettings()
                settings.setResolution(640, 480)
                print('resolution', settings.resolution())
                settings.setQuality(QMultimedia.EncodingQuality.VeryHighQuality)
                print('quality', settings.quality())
                settings.setFrameRate(25)
                print('frameRate', settings.frameRate())
                settings.setCodec("video/mp4")
                print('codec', settings.codec())
                self.recorder.setVideoSettings(settings)
                self.recorder.setContainerFormat("mp4")
            except Exception as e:
                print(e)
     
            self.recorder.record()
            #Error {NoError, ResourceError, FormatError, OutOfSpaceError}
            #State {StoppedState, RecordingState, PausedState}
            #Status { UnavailableStatus, UnloadedStatus, LoadingStatus, LoadedStatus, StartingStatus, …, FinalizingStatus }
            print('recorder error', self.recorder.error())
            print('recorder state', self.recorder.state())
            print('recorder status', self.recorder.status())
            print('start')
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    resolution PyQt5.QtCore.QSize(640, 480)
    quality 4
    frameRate 25.0
    codec video/mp4
    recorder error 0
    recorder state 0
    recorder status 0
    start
    J'ai vu des posts (ici) qui disaient qu'ils y avait des limitations sous windows, mais ces posts datent de 2020.

    Nico

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    J'ai vu des posts (ici) qui disaient qu'ils y avait des limitations sous windows, mais ces posts datent de 2020.
    Ces posts vous renvoient à une documentation officielle qui dit que...

    Si la documentation de la version de Qt (que vous) utilisée(ez) dit la même chose, changer d'environnement système ou capturer les vidéos autrement... seront les solutions à explorer...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2021, 17h10
  2. enregistrer un flux vidéo a partir de la webcam
    Par zouarimariem dans le forum C#
    Réponses: 8
    Dernier message: 28/03/2012, 12h37
  3. Enregistrer le flux video d'une WebCam ?
    Par sadao dans le forum Flash
    Réponses: 1
    Dernier message: 19/02/2007, 08h37
  4. [AJAX] Enregistrer un flux XML
    Par Bissada dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/06/2006, 17h52
  5. afficher la flux d'une webcam en direct sur une page web
    Par michel_frederic dans le forum Multimédia
    Réponses: 8
    Dernier message: 15/06/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo