rtsp_video_server_wlan.py
# Questo lavoro è concesso in licenza MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tutti i diritti riservati.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Server video RTSP
#
# Questo esempio mostra come trasmettere video in streaming via RTSP con la tua OpenMV Cam.
#
# Puoi usare un programma come VLC per visualizzare lo stream video connettendoti
# all'indirizzo IP della OpenMV Cam. Tuttavia, OpenMV IDE include un visualizzatore RTSP basato su FFPLAY che
# puoi usare andando su Tools->Video Tools->Play RSTP Stream.
import network
import rtsp
import csi
import time
# Se usi VLC su Linux potresti dover installare la libreria live555 affinché il supporto RTSP
# funzioni. Se usi Ubuntu, esegui il comando seguente:
#
# sudo apt-get install livemedia-utils
# Per quanto riguarda la latenza su programmi come VLC, il valore predefinito è tipicamente impostato per bufferizzare 1 secondo di video
# prima della riproduzione. Per ridurla è necessario ridurre il caching di rete, che può essere impostato usando
# "mostra più opzioni" quando apri lo stream di rete in VLC. Puoi ridurlo a circa 10ms
# per rendere il video in tempo reale.
csi0 = csi.CSI(stream=False)
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
# Configurazione dell'interfaccia di rete
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)
# Configurazione del server RTSP
server = rtsp.rtsp_server(network_if)
# Per le funzioni di callback seguenti:
#
# `pathname` è il nome della risorsa dello stream richiesta dal client. Puoi ignorarlo se non è
# necessario. Altrimenti, puoi usarlo per determinare quale oggetto immagine restituire. Per impostazione predefinita il percorso
# sarà "/".
#
# `session` è un numero casuale che cambia quando viene stabilita una nuova connessione. Puoi usarlo
# insieme a un dizionario per distinguere i diversi accessi allo stesso nome di file.
# Tieni traccia degli FPS correnti.
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 mette in pausa solo localmente. Questa funzione non viene mai chiamata.
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)
# Chiamata ogni volta che è necessario un nuovo fotogramma.
def image_callback(pathname, session):
global csi0
global clock
img = csi0.snapshot()
# Contrassegna l'immagine e/o esegue varie operazioni.
print(clock.fps())
clock.tick()
return img
# Lo streaming non ritorna. Chiamerà `image_callback` quando ha bisogno di ottenere un oggetto immagine da inviare
# al client rtsp remoto connesso al server.
server.stream(image_callback, quality=70)