rtsp_video_server_wlan.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.WLAN(network.STA_IF)
network_if.active(True)
network_if.connect("your-ssid", "your-password")
while not network_if.isconnected():
print("Trying to connect. Note this may take a while...")
time.sleep_ms(1000)
# 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)