rtsp_video_server_lan.py
# Este trabalho está licenciado sob a licença MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos os direitos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Servidor de vídeo RTSP
#
# Este exemplo mostra como transmitir vídeo via RTSP com a sua OpenMV Cam.
#
# Você pode usar um programa como o VLC para ver o stream de vídeo conectando-se ao
# endereço IP da OpenMV Cam. No entanto, a OpenMV IDE tem um visualizador RTSP embutido baseado em FFPLAY que
# você pode usar indo em Tools->Video Tools->Play RSTP Stream.
import network
import rtsp
import csi
import time
# Se você estiver usando o VLC no linux, pode ser necessário instalar a biblioteca live555 para o suporte a RTSP
# funcionar. Se você estiver usando o Ubuntu, execute o seguinte comando:
#
# sudo apt-get install livemedia-utils
# Quanto à latência em programas como o VLC, o padrão normalmente é bufferizar 1 segundo de vídeo
# antes de reproduzir. Para reduzir isso, é preciso reduzir o cache de rede, que pode ser definido usando
# "mostrar mais opções" ao abrir o stream de rede no VLC. Você pode reduzir isso para algo como 10ms
# para tornar o vídeo em tempo real.
csi0 = csi.CSI(stream=False)
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
# Configurar a interface de rede
network_if = network.LAN()
network_if.active(True)
network_if.ifconfig("dhcp")
# Configurar o servidor RTSP
server = rtsp.rtsp_server(network_if)
# Para as funções de callback abaixo:
#
# `pathname` é o nome do recurso de stream que o cliente deseja. Você pode ignorar isso se não for
# necessário. Caso contrário, pode usá-lo para determinar qual objeto de imagem retornar. Por padrão o
# pathname será "/".
#
# `session` é um número aleatório que muda quando uma nova conexão é estabelecida. Você pode usar
# session com um dicionário para diferenciar acessos distintos ao mesmo nome de arquivo.
# Acompanhar o FPS atual.
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): # O VLC apenas pausa localmente. Isso nunca é chamado.
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)
# Chamado a cada vez que um novo quadro é necessário.
def image_callback(pathname, session):
global csi0
global clock
img = csi0.snapshot()
# Marcar a imagem e/ou fazer diversas operações.
print(clock.fps())
clock.tick()
return img
# O stream não retorna. Ele chamará `image_callback` quando precisar obter um objeto de imagem para enviar
# ao cliente rtsp remoto que se conecta ao servidor.
server.stream(image_callback, quality=70)