 
.. note::

    Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi rejoindre ?**

    - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
    - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
    - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.

    👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui !

.. _3.1.2_py_pi5:

3.1.2 Module Vidéo
=====================

Introduction
---------------

En plus de prendre des photos, le module caméra peut également être utilisé pour enregistrer des vidéos.

Composants nécessaires
--------------------------

Dans ce projet, nous avons besoin des composants suivants.

.. image:: ../python_pi5/img/3.3.2_photograph_list.png
  :width: 800

Il est certainement pratique d'acheter un kit complet, voici le lien :

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nom
        - ARTICLES DANS CE KIT
        - LIEN
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Vous pouvez également les acheter séparément via les liens ci-dessous.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - INTRODUCTION DU COMPOSANT
        - LIEN D'ACHAT

    *   - :ref:`cpn_camera_module`
        - |link_camera_buy|

Procédures expérimentales
-----------------------------

**Étape 1 :** Accédez au bureau du Raspberry Pi. Vous aurez peut-être besoin d'un écran pour une meilleure expérience, référez-vous à : `Connecter votre Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Ou accédez au bureau du Raspberry Pi à distance, pour un tutoriel détaillé veuillez consulter :ref:`remote_desktop`.

**Étape 2 :** Ouvrez un Terminal et accédez au dossier du code.

.. code-block::

    cd ~/raphael-kit/python-pi5

**Étape 3 :** Exécutez.

.. code-block::

    sudo python3 3.1.2_VideoModule_zero.py

Exécutez le code pour commencer l'enregistrement. Appuyez sur ``Ctrl+C`` pour terminer l'enregistrement. Nommez la vidéo ``my_video.h264`` et enregistrez-la dans le répertoire ``~``.

.. note::

    Vous pouvez également ouvrir ``3.1.2_PhotographModule_zero.py`` dans le chemin ``~/raphael-kit/python-pi5`` avec un IDE Python, cliquer sur le bouton Exécuter pour exécuter et arrêter le code avec le bouton Stop.

Si vous souhaitez envoyer des photos vers votre PC, veuillez vous référer à :ref:`filezilla`.

.. warning::

    Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`

**Code**

.. code-block:: python

   #!/usr/bin/env python3

   import time
   from picamera2 import Picamera2, Preview
   from picamera2.encoders import H264Encoder
   from picamera2.outputs import FfmpegOutput
   import os

   # Get the current user's login name
   user = os.getlogin()
   # Get the path to the user's home directory
   user_home = os.path.expanduser(f'~{user}')

   # Create a Picamera2 instance
   camera = Picamera2()
   # Retrieve the default preview configuration
   preview_config = camera.preview_configuration

   try:
       # Configure preview size and format
       preview_config.size = (800, 600)
       preview_config.format = 'XRGB8888'
       # Start the camera preview in QTGL mode
       camera.start_preview(Preview.QTGL)

       # Define video configuration with size, frame rate, and buffer count
       conf = {'size': (800, 600)}
       controls = {'FrameRate': 40}
       config = camera.create_video_configuration(main=conf, controls=controls, buffer_count=12)
       # Create a video encoder with a specified bitrate
       encoder = H264Encoder(bitrate=10000000)
       # Define output file for the video
       output = FfmpegOutput(f'{user_home}/my_video.mp4')
       # Configure and start recording
       camera.configure(config)
       camera.start_recording(encoder, output)
       # Record for 10 seconds
       time.sleep(10)
       # Stop the recording
       camera.stop_recording()

   except KeyboardInterrupt:
       # Stop the camera preview if a KeyboardInterrupt (e.g., Ctrl+C) occurs
       camera.stop_preview()
       pass


**Explication du Code**

#. Importe les bibliothèques et les classes nécessaires. La bibliothèque ``picamera2`` est utilisée pour le contrôle de la caméra, ``H264Encoder`` pour l'encodage vidéo, et ``FfmpegOutput`` pour définir le fichier de sortie vidéo.

   .. code-block:: python

       #!/usr/bin/env python3

       import time
       from picamera2 import Picamera2, Preview
       from picamera2.encoders import H264Encoder
       from picamera2.outputs import FfmpegOutput
       import os

#. Récupère le nom de connexion de l'utilisateur actuel et le chemin de son répertoire personnel.

   .. code-block:: python

       # Get the current user's login name
       user = os.getlogin()
       # Get the path to the user's home directory
       user_home = os.path.expanduser(f'~{user}')

#. Crée une instance de la classe ``Picamera2`` et récupère la configuration de prévisualisation par défaut.

   .. code-block:: python

       # Create a Picamera2 instance
       camera = Picamera2()
       # Retrieve the default preview configuration
       preview_config = camera.preview_configuration

#. Définit la taille et le format de la prévisualisation de la caméra. La taille est définie à 800x600 pixels, et le format est défini à ``XRGB8888``.

   .. code-block:: python

       try:
           # Configure preview size and format
           preview_config.size = (800, 600)
           preview_config.format = 'XRGB8888'
           
#. Démarre la prévisualisation de la caméra en mode QTGL, un mode de prévisualisation graphique.

   .. code-block:: python

       try:
           ...          
             
           # Start the camera preview in QTGL mode
           camera.start_preview(Preview.QTGL)
           
           ...

#. Définit la configuration vidéo avec une taille de cadre de 800x600 pixels et un taux de trame de 40 images par seconde.

   .. code-block:: python

       try:
           ...
           
           # Define video configuration with size, frame rate, and buffer count
           conf = {'size': (800, 600)}
           controls = {'FrameRate': 40}
           config = camera.create_video_configuration(main=conf, controls=controls, buffer_count=12)
           
           ...

#. Crée un encodeur vidéo avec un débit binaire spécifié de 10 Mbps, utilisant le format d'encodage H.264. Définit le chemin du fichier de sortie pour la vidéo, en l'enregistrant sous ``my_video.mp4`` dans le répertoire personnel de l'utilisateur.

   .. code-block:: python

       try:
           ...

           # Create a video encoder with a specified bitrate
           encoder = H264Encoder(bitrate=10000000)
           # Define output file for the video
           output = FfmpegOutput(f'{user_home}/my_video.mp4')
           
           ...

#. Configure la caméra avec les paramètres vidéo définis, commence l'enregistrement en utilisant l'encodeur et le fichier de sortie spécifiés, enregistre pendant 10 secondes, puis arrête l'enregistrement.

   .. code-block:: python

       try:
           ...

           # Configure and start recording
           camera.configure(config)
           camera.start_recording(encoder, output)
           # Record for 10 seconds
           time.sleep(10)
           # Stop the recording
           camera.stop_recording()

#. Ce bloc de code gère une interruption clavier (comme Ctrl+C) en arrêtant la prévisualisation de la caméra. L'instruction ``pass`` est utilisée pour gérer l'exception sans rien faire d'autre.

   .. code-block:: python

       except KeyboardInterrupt:
           # Stop the camera preview if a KeyboardInterrupt (e.g., Ctrl+C) occurs
           camera.stop_preview()
           pass







