rtsp_video_server_lan.py

# Esta obra está licenciada bajo la licencia MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos los derechos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Servidor de video RTSP
#
# Este ejemplo muestra cómo transmitir video por RTSP con su OpenMV Cam.
#
# Puede usar un programa como VLC para ver la transmisión de video conectándose a la
# dirección IP de la OpenMV Cam. Sin embargo, OpenMV IDE incluye un visor RTSP basado en FFPLAY que
# puede usar accediendo a Tools->Video Tools->Play RSTP Stream.

import network
import rtsp
import csi
import time

# Si usa VLC en Linux, es posible que deba instalar la biblioteca live555 para que la compatibilidad con RTSP
# funcione. Si usa Ubuntu, ejecute el siguiente comando:
#
# sudo apt-get install livemedia-utils

# En cuanto a la latencia en programas como VLC, el valor predeterminado suele almacenar en búfer 1 segundo de video
# antes de la reproducción. Para reducirla, debe disminuir el almacenamiento en caché de red, que se puede configurar usando
# "mostrar más opciones" al abrir la transmisión de red en VLC. Puede reducirlo a unos 10ms
# para que el video sea en tiempo real.

csi0 = csi.CSI(stream=False)
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)

# Configurar la interfaz de red

network_if = network.LAN()
network_if.active(True)
network_if.ifconfig("dhcp")

# Configurar el servidor RTSP

server = rtsp.rtsp_server(network_if)

# Para las funciones de callback a continuación:
#
# `pathname` es el nombre del recurso de transmisión que solicita el cliente. Puede ignorarlo si no es
# necesario. De lo contrario, puede usarlo para determinar qué objeto de imagen devolver. Por defecto, la ruta
# será "/".
#
# `session` es un número aleatorio que cambia cada vez que se establece una nueva conexión. Puede usar
# session junto con un diccionario para diferenciar distintos accesos al mismo nombre de archivo.

# Registrar los FPS actuales.
clock = time.clock()


def setup_callback(pathname, session):
    print('Opening "%s" in session %d' % (pathname, session))


def play_callback(pathname, session):
    global clock
    clock.reset()
    clock.tick()
    print('Playing "%s" in session %d' % (pathname, session))


def pause_callback(pathname, session):  # VLC solo pausa localmente. Esto nunca se llama.
    print('Pausing "%s" in session %d' % (pathname, session))


def teardown_callback(pathname, session):
    print('Closing "%s" in session %d' % (pathname, session))


server.register_setup_cb(setup_callback)
server.register_play_cb(play_callback)
server.register_pause_cb(pause_callback)
server.register_teardown_cb(teardown_callback)


# Se llama cada vez que se necesita un nuevo fotograma.
def image_callback(pathname, session):
    global csi0
    global clock
    img = csi0.snapshot()
    # Marcar la imagen y/o realizar diversas acciones.
    print(clock.fps())
    clock.tick()
    return img


# La transmisión nunca retorna. Llamará a `image_callback` cuando necesite obtener un objeto de imagen para enviarlo
# al cliente RTSP remoto que se conecta al servidor.

server.stream(image_callback, quality=70)

results matching ""

    No results matching ""