Correo: [email protected] - Teléfono: +56979962128

En esta guía, te enseñaremos a configurar un servidor streaming de video con una Raspberry Pi y una cámara usando un script simple con la librería Picamera2

. Podrás acceder al servidor web de streaming desde cualquier navegador web de tu red local.

Raspberry Pi MJPEG Streaming Web Server Picamera2

Prerrequisitos 

Antes de continuar, debes cumplir los siguientes requisitos:

    Librería de Python Picamera2 

    Picamera2

     es una librería de Python para interactuar con la cámara de Raspberry Pi. Se basa en la arquitectura de cámaras  

    libcamera

     y la mantiene la fundación Raspberry Pi. No es recomendable usar la antigua librería Picamera

     con las últimas versiones del sistema operativo Raspberry Pi.

    La librería de Picamera2 es compatible con todos los modelos de Raspberry Pi, desde Pi Zero hasta RPi 5.

    Instalación de la librería Picamera2 

    Una vez establecida una conexión SSH con tu Raspberry Pi, actualiza y mejora tu Raspberry Pi si es que hay actualizaciones disponibles. Ejecuta el siguiente comando:

    sudo apt update && sudo apt upgrade -y
      Ejecute el siguiente comando para instalar la librería Picamera2 en tu Raspberry Pi.
    sudo apt install -y python3-picamera2
    Se recomienda encarecidamente instalar y actualizar Picamera2 utilizando el comando apt descrito anteriormente para evitar problemas de compatibilidad. Suelen ocurrir problemas de compilación al intentar instalar la librería Picamera2 con comando PIP mediante un entorno virtual.

    Preparación de la cámara Raspberry Pi

    La cámara Raspberry Pi es un módulo de cámara pequeño y de bajo costo compatible con las placas Raspberry Pi. Si bien puede ser lo suficientemente bueno para la mayoría de los proyectos, también existen otras cámaras USB compatibles con nuestra Raspberry que pueden resultar una gran opción. Para esta guía, utilizaremos el módulo Raspberry Pi Camera V2 que se muestra en la siguiente imagen: Raspberry Pi Camera Module V2 Esta guía también funciona con la Raspberry Pi Camera V3 y la cámara es compatible con todos los modelos de Raspberry Pi.

    Habilitar el módulo de cámara Raspberry Pi

    Si estas corriendo la ultima versión del OS de Raspberry pi, las cámaras oficiales serán detectadas y activadas automáticamente.

    Conectando la cámara

    Conectar el módulo de cámara Raspberry Pi es muy sencillo. Con la Pi apagada, conecta la cámara al puerto CSI de la Pi como se muestra en la siguiente figura. Raspberry Pi 5 Pi Camera Module v2 connected cable Raspberry Pi 4 with Camera Module port labelled Connect camera Ribon
     

    Servidor streaming de video MJPEG – Código Python

    Ejecutar un servidor web de transmisión es bastante fácil con la cámara Raspberry Pi gracias a la librería Picamera2 de Python. Cree un nuevo archivo llamado stream_server.py ejecutando el siguiente comando: 
    nano stream_server.py
    Copia el siguiente código en el archivo recién creado:
    import io
    import logging
    import socketserver
    from http import server
    from threading import Condition
    
    from picamera2 import Picamera2
    from picamera2.encoders import JpegEncoder
    from picamera2.outputs import FileOutput
    
    PAGE = """
    <html>
    <head>
    <title>picamera2 MJPEG streaming demo</title>
    </head>
    <body>
    <h1>Picamera2 MJPEG Streaming Demo</h1>
    <img src="stream.mjpg" width="640" height="480" />
    </body>
    </html>
    """
    
    class StreamingOutput(io.BufferedIOBase):
        def __init__(self):
            self.frame = None
            self.condition = Condition()
    
        def write(self, buf):
            with self.condition:
                self.frame = buf
                self.condition.notify_all()
    
    
    class StreamingHandler(server.BaseHTTPRequestHandler):
        def do_GET(self):
            if self.path == '/':
                self.send_response(301)
                self.send_header('Location', '/index.html')
                self.end_headers()
            elif self.path == '/index.html':
                content = PAGE.encode('utf-8')
                self.send_response(200)
                self.send_header('Content-Type', 'text/html')
                self.send_header('Content-Length', len(content))
                self.end_headers()
                self.wfile.write(content)
            elif self.path == '/stream.mjpg':
                self.send_response(200)
                self.send_header('Age', 0)
                self.send_header('Cache-Control', 'no-cache, private')
                self.send_header('Pragma', 'no-cache')
                self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
                self.end_headers()
                try:
                    while True:
                        with output.condition:
                            output.condition.wait()
                            frame = output.frame
                        self.wfile.write(b'--FRAMErn')
                        self.send_header('Content-Type', 'image/jpeg')
                        self.send_header('Content-Length', len(frame))
                        self.end_headers()
                        self.wfile.write(frame)
                        self.wfile.write(b'rn')
                except Exception as e:
                    logging.warning(
                        'Removed streaming client %s: %s',
                        self.client_address, str(e))
            else:
                self.send_error(404)
                self.end_headers()
    
    
    class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
        allow_reuse_address = True
        daemon_threads = True
    
    
    picam2 = Picamera2()
    picam2.configure(picam2.create_video_configuration(main={"size": (640, 480)}))
    output = StreamingOutput()
    picam2.start_recording(JpegEncoder(), FileOutput(output))
    
    try:
        address = ('', 7123)
        server = StreamingServer(address, StreamingHandler)
        server.serve_forever()
    finally:
        picam2.stop_recording()
    Presiona CTRL+X para guardar el archivo, escribe Y y presiona ENTER Puedes personalizar la página web modificando el HTML y agregando algo de CSS en la variable PAGE. El archivo stream.mjpg se refiere a los archivos de transmisión (el video actual).
    PAGE = """
    <html>
    <head>
    <title>picamera2 MJPEG streaming demo</title>
    </head>
    <body>
    <h1>Picamera2 MJPEG Streaming Demo</h1>
    <img src="stream.mjpg" width="640" height="480" />
    </body>
    </html>
    """

    Ejecutando el script 

    Ejecute el siguiente comando para obtener la dirección IP de Raspberry Pi. Necesitarás la dirección IP para acceder a tu servidor web.
    hostname -I
    Raspberry Pi IP Address Luego, inicia tu servidor web ejecutando el siguiente comando en el directorio de tu proyecto: 
    python stream_server.py
    stream server picamera2 run Python command Finalmente, abre cualquier navegador web en tu red local y escribe la dirección IP de tu Raspberry Pi seguida por el numero de puerto :7123
    http://raspberry-pi-ip-address:7123

    Y eso es todo! El servidor streaming de video MJPEG ya funciona desde tu Raspberry Pi

      Streaming video MJPEG server Picamera2 Python example script

    PARA FINALIZAR

    En esta guía rápida, aprendes como configurar una cámara IP usando la Raspberry Pi y la cámara oficial. Esto puede ser muy útil para monitorear algo en tu red de en tiempo real. Uno de los usos más comunes es para poder seguir el proceso en impresoras 3D por ejemplo, pero también hay un amplio catálogo de aplicaciones como timbres inteligentes o cámaras de seguridad que funcionan de manera excelente.

    Aprende esto en un curso

    Si prefieres verlo en vivo y con alguien que resuelva tus dudas, estos cursos presenciales de MCI Educación cubren el tema de este tutorial: