rtsp_video_server_wlan.py

# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Видеосервер RTSP
#
# Этот пример показывает, как транслировать видео по RTSP с вашей камеры OpenMV Cam.
#
# Вы можете использовать такую программу, как VLC, для просмотра видеопотока, подключившись к
# IP-адресу камеры OpenMV Cam. Однако в OpenMV IDE есть встроенный просмотрщик RTSP на основе FFPLAY, который
# можно открыть через Tools->Video Tools->Play RSTP Stream.

import network
import rtsp
import csi
import time

# Если вы используете VLC в Linux, для поддержки RTSP может потребоваться установить библиотеку live555, чтобы
# всё работало. Если вы используете Ubuntu, выполните следующую команду:
#
# sudo apt-get install livemedia-utils

# Что касается задержки в таких программах, как VLC: по умолчанию обычно буферизуется 1 секунда видео
# перед воспроизведением. Чтобы уменьшить это, нужно уменьшить сетевое кеширование, которое можно настроить через
# "show more options" при открытии сетевого потока в VLC. Это значение можно уменьшить примерно до 10 мс,
# чтобы видео передавалось в реальном времени.

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

# Настройка сетевого интерфейса

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)

# Настройка сервера RTSP

server = rtsp.rtsp_server(network_if)

# Что касается функций обратного вызова ниже:
#
# `pathname` — это имя ресурса потока, который запрашивает клиент. Вы можете игнорировать это, если оно не
# нужно. В противном случае с его помощью можно определить, какой объект изображения вернуть. По умолчанию путь
# будет равен "/".
#
# `session` — это случайное число, которое меняется при установлении нового соединения. Его можно использовать
# вместе со словарём, чтобы различать разные обращения к одному и тому же имени файла.

# Отслеживать текущую частоту кадров.
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 ставит на паузу только локально. Эта функция никогда не вызывается.
    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)


# Вызывается каждый раз, когда требуется новый кадр.
def image_callback(pathname, session):
    global csi0
    global clock
    img = csi0.snapshot()
    # Разметка изображения и/или другие действия.
    print(clock.fps())
    clock.tick()
    return img


# Функция стрима не возвращает управление. Она будет вызывать `image_callback`, когда ей нужно получить объект изображения для отправки
# удалённому rtsp-клиенту, подключённому к серверу.

server.stream(image_callback, quality=70)

results matching ""

    No results matching ""