rtsp_video_server_lan.py
# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Serveur vidéo RTSP
#
# Cet exemple montre comment diffuser de la vidéo via RTSP avec votre caméra OpenMV.
#
# Vous pouvez utiliser un programme comme VLC pour visualiser le flux vidéo en vous connectant à
# l'adresse IP de la caméra OpenMV. Cependant, l'IDE OpenMV intègre un lecteur RTSP basé sur FFPLAY que
# vous pouvez utiliser via Tools->Video Tools->Play RSTP Stream.
import network
import rtsp
import csi
import time
# Si vous utilisez VLC sous Linux, vous devrez peut-être installer la bibliothèque live555 pour que la prise en charge de RTSP
# fonctionne. Si vous utilisez Ubuntu, exécutez la commande suivante :
#
# sudo apt-get install livemedia-utils
# Concernant la latence sur des programmes comme VLC, la mise en mémoire tampon par défaut est généralement d'1 seconde de vidéo
# avant la lecture. Pour la réduire, vous devez diminuer la mise en cache réseau, réglable via
# "afficher plus d'options" lorsque vous ouvrez le flux réseau dans VLC. Vous pouvez la réduire à environ 10 ms
# pour obtenir une vidéo en temps réel.
csi0 = csi.CSI(stream=False)
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
# Configurer l'interface réseau
network_if = network.LAN()
network_if.active(True)
network_if.ifconfig("dhcp")
# Configurer le serveur RTSP
server = rtsp.rtsp_server(network_if)
# Pour les fonctions de rappel (callback) ci-dessous :
#
# `pathname` est le nom de la ressource de flux demandée par le client. Vous pouvez l'ignorer si ce n'est pas
# nécessaire. Sinon, vous pouvez l'utiliser pour déterminer quel objet image renvoyer. Par défaut, le
# nom du chemin sera "/".
#
# `session` est un nombre aléatoire qui change à chaque nouvelle connexion établie. Vous pouvez utiliser
# session avec un dictionnaire pour distinguer les différents accès au même nom de fichier.
# Suivre le FPS actuel.
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 ne met en pause que localement. Ceci n'est jamais appelé.
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)
# Appelé chaque fois qu'une nouvelle image est nécessaire.
def image_callback(pathname, session):
global csi0
global clock
img = csi0.snapshot()
# Annoter l'image et/ou effectuer diverses opérations.
print(clock.fps())
clock.tick()
return img
# Stream ne retourne jamais. Il appellera `image_callback` lorsqu'il aura besoin d'obtenir un objet image à envoyer
# au client rtsp distant connecté au serveur.
server.stream(image_callback, quality=70)