.. note::

    Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

.. _3.1.2_py_pi5:

3.1.2 Videomodul
=====================

Einführung
-----------------

Zusätzlich zur Aufnahme von Fotos kann das Kameramodul auch zur Aufzeichnung von Videos verwendet werden.

Benötigte Komponenten
------------------------------

Für dieses Projekt benötigen wir die folgenden Komponenten.

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

Es ist definitiv praktisch, ein gesamtes Kit zu kaufen, hier ist der Link:

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

    *   - Name	
        - INHALTE DIESES KITS
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Sie können diese auch einzeln über die untenstehenden Links kaufen.

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

    *   - KOMPONENTENÜBERSICHT
        - KAUF-LINK

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

Experimentelle Verfahren
------------------------------

**Schritt 1:** Wechseln Sie zum Raspberry Pi Desktop. Für eine bessere Erfahrung benötigen Sie möglicherweise einen Bildschirm, siehe: `Verbinden Sie Ihren Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Oder greifen Sie remote auf den Raspberry Pi Desktop zu, für eine detaillierte Anleitung siehe :ref:`remote_desktop`.

**Schritt 2:** Öffnen Sie ein Terminal und wechseln Sie in das Verzeichnis des Codes.


.. code-block::

    cd ~/raphael-kit/python-pi5

**Schritt 3:** Ausführen.


.. code-block::

    sudo python3 3.1.2_VideoModule_zero.py

Führen Sie den Code aus, um die Aufnahme zu starten. Drücken Sie ``Ctrl+C``, um die Aufnahme zu beenden. Benennen Sie das Video ``my_video.h264`` und speichern Sie es im Verzeichnis ``~``.

.. note::

    Sie können auch ``3.1.2_PhotographModule_zero.py`` im Pfad ``~/raphael-kit/python-pi5`` mit einer Python-IDE öffnen, den Ausführen-Button klicken, um es zu starten, und den Code mit dem Stopp-Button beenden.

Wenn Sie Fotos an Ihren PC senden möchten, siehe :ref:`filezilla`.


.. warning::

    Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :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

**Code-Erklärung**

#. Importiert die notwendigen Bibliotheken und Klassen. Die Bibliothek ``picamera2`` wird für die Kamerasteuerung verwendet, ``H264Encoder`` für die Videoenkodierung und ``FfmpegOutput`` für die Definition der Videoausgabedatei.

   .. code-block:: python

       #!/usr/bin/env python3

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

#. Ruft den Login-Namen des aktuellen Benutzers und den Pfad zu dessen Home-Verzeichnis ab.

   .. 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}')

#. Erstellt eine Instanz der Klasse ``Picamera2`` und ruft die Standard-Vorschaueinstellung ab.

   .. code-block:: python

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

#. Stellt die Größe und das Format der Kameravorschau ein. Die Größe wird auf 800x600 Pixel festgelegt, das Format auf ``XRGB8888``.

   .. code-block:: python

       try:
           # Configure preview size and format
           preview_config.size = (800, 600)
           preview_config.format = 'XRGB8888'
           
#. Startet die Kameravorschau im QTGL-Modus, einem grafischen Vorschaumodus.

   .. code-block:: python

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

#. Definiert die Videokonfiguration mit einer Bildgröße von 800x600 Pixeln und einer Bildrate von 40 Bildern pro Sekunde.

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


#. Erstellt einen Videoencoder mit einer festgelegten Bitrate von 10 Mbps, unter Verwendung des H.264-Encoding-Formats. Legt den Ausgabedateipfad für das Video fest, speichert es als ``my_video.mp4`` im Home-Verzeichnis des Benutzers.

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

#. Konfiguriert die Kamera mit den definierten Videoeinstellungen, startet die Aufnahme mit dem angegebenen Encoder und der Ausgabedatei, nimmt 10 Sekunden auf und stoppt dann die Aufnahme.

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

#. Dieser Block von Code behandelt ein KeyboardInterrupt (z. B. Ctrl+C), indem die Kameravorschau gestoppt wird. Das ``pass`` Statement wird verwendet, um die Ausnahme zu behandeln, ohne etwas anderes zu tun.

   .. code-block:: python

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

