.. note::

    Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché Unirsi?**

    - **Supporto Tecnico Esperto**: Risolvi i problemi post-vendita e affronta le sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive.

    👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!

.. _3.1.2_py_pi5:

3.1.2 Modulo Video
=====================

Introduzione
---------------

Oltre a scattare foto, il Modulo Fotocamera può essere utilizzato anche per registrare video.

Componenti Necessari
-----------------------

In questo progetto, abbiamo bisogno dei seguenti componenti.

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

È decisamente conveniente acquistare un kit completo, ecco il link: 

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

    *   - Nome	
        - COMPONENTI NEL KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link sottostanti.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

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

Procedure Sperimentali
-------------------------

**Passo 1:** Accedi al desktop di Raspberry Pi. Potresti aver bisogno di uno schermo per un'esperienza migliore, fai riferimento a: `Collega il tuo Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Oppure accedi al desktop di Raspberry Pi da remoto, per un tutorial dettagliato consulta :ref:`remote_desktop`.

**Passo 2:** Apri un Terminale e vai nella cartella del codice.

.. code-block::

    cd ~/raphael-kit/python-pi5

**Passo 3:** Esegui il comando.

.. code-block::

    sudo python3 3.1.2_VideoModule_zero.py

Esegui il codice per avviare la registrazione. Premi ``Ctrl+C`` per terminare la registrazione. Il video verrà chiamato ``my_video.h264`` e salvato nella directory ``~``.

.. note::

    Puoi anche aprire ``3.1.2_PhotographModule_zero.py`` nel percorso ``~/raphael-kit/python-pi5`` con un IDE Python, fare clic sul pulsante Esegui per avviare e utilizzare il pulsante Stop per interrompere il codice.

Se desideri inviare le foto al tuo PC, fai riferimento a :ref:`filezilla`.


.. warning::

    Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :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

   # Ottieni il nome dell'utente attualmente connesso
   user = os.getlogin()
   # Ottieni il percorso della directory home dell'utente
   user_home = os.path.expanduser(f'~{user}')

   # Crea un'istanza di Picamera2
   camera = Picamera2()
   # Recupera la configurazione di anteprima predefinita
   preview_config = camera.preview_configuration

   try:
       # Configura la dimensione e il formato dell'anteprima
       preview_config.size = (800, 600)
       preview_config.format = 'XRGB8888'
       # Avvia l'anteprima della fotocamera in modalità QTGL
       camera.start_preview(Preview.QTGL)

       # Definisci la configurazione video con dimensioni, frame rate e buffer
       conf = {'size': (800, 600)}
       controls = {'FrameRate': 40}
       config = camera.create_video_configuration(main=conf, controls=controls, buffer_count=12)
       # Crea un codificatore video con un bitrate specificato
       encoder = H264Encoder(bitrate=10000000)
       # Definisci il file di output per il video
       output = FfmpegOutput(f'{user_home}/my_video.mp4')
       # Configura e avvia la registrazione
       camera.configure(config)
       camera.start_recording(encoder, output)
       # Registra per 10 secondi
       time.sleep(10)
       # Interrompi la registrazione
       camera.stop_recording()

   except KeyboardInterrupt:
       # Interrompe l'anteprima della fotocamera se si verifica un'interruzione da tastiera (ad esempio, Ctrl+C)
       camera.stop_preview()
       pass


**Spiegazione del Codice**

#. Importa le librerie e le classi necessarie. La libreria ``picamera2`` viene utilizzata per il controllo della fotocamera, ``H264Encoder`` per la codifica video e ``FfmpegOutput`` per definire il file di output del video.

   .. 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

#. Recupera il nome dell'utente attualmente connesso e il percorso della sua directory home.

   .. code-block:: python

       # Ottieni il nome dell'utente attualmente connesso
       user = os.getlogin()
       # Ottieni il percorso della directory home dell'utente
       user_home = os.path.expanduser(f'~{user}')

#. Crea un'istanza della classe ``Picamera2`` e recupera la configurazione di anteprima predefinita.

   .. code-block:: python

       # Crea un'istanza di Picamera2
       camera = Picamera2()
       # Recupera la configurazione di anteprima predefinita
       preview_config = camera.preview_configuration

#. Imposta la dimensione e il formato dell'anteprima della fotocamera. La dimensione è impostata su 800x600 pixel e il formato è impostato su ``XRGB8888``.

   .. code-block:: python

       try:
           # Configura la dimensione e il formato dell'anteprima
           preview_config.size = (800, 600)
           preview_config.format = 'XRGB8888'
           
#. Avvia l'anteprima della fotocamera in modalità QTGL, una modalità di anteprima grafica.

   .. code-block:: python

       try:
           ...          
             
           # Avvia l'anteprima della fotocamera in modalità QTGL
           camera.start_preview(Preview.QTGL)
           
           ...

#. Definisce la configurazione video con una dimensione del frame di 800x600 pixel e un frame rate di 40 fotogrammi al secondo.

   .. code-block:: python

       try:
           ...
           
           # Definisci la configurazione video con dimensioni, frame rate e buffer
           conf = {'size': (800, 600)}
           controls = {'FrameRate': 40}
           config = camera.create_video_configuration(main=conf, controls=controls, buffer_count=12)
           
           ...

#. Crea un codificatore video con un bitrate specificato di 10 Mbps, utilizzando il formato di codifica H.264. Configura il percorso del file di output per il video, salvandolo come ``my_video.mp4`` nella directory home dell'utente.

   .. code-block:: python

       try:
           ...

           # Crea un codificatore video con un bitrate specificato
           encoder = H264Encoder(bitrate=10000000)
           # Definisci il file di output per il video
           output = FfmpegOutput(f'{user_home}/my_video.mp4')
           
           ...

#. Configura la fotocamera con le impostazioni video definite, avvia la registrazione utilizzando il codificatore e il file di output specificato, registra per 10 secondi e poi interrompe la registrazione.

   .. code-block:: python

       try:
           ...

           # Configura e avvia la registrazione
           camera.configure(config)
           camera.start_recording(encoder, output)
           # Registra per 10 secondi
           time.sleep(10)
           # Interrompi la registrazione
           camera.stop_recording()

#. Questo blocco di codice gestisce un'interruzione da tastiera (come Ctrl+C) interrompendo l'anteprima della fotocamera. L'istruzione ``pass`` viene utilizzata per gestire l'eccezione senza fare nulla.

   .. code-block:: python

       except KeyboardInterrupt:
           # Interrompe l'anteprima della fotocamera se si verifica un'interruzione da tastiera (ad esempio, Ctrl+C)
           camera.stop_preview()
           pass

