rtsp_video_server_lan.py

# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# RTSP動画サーバー
#
# この例では、OpenMV Camを使ってRTSPで動画をストリーミングする方法を示します。
#
# OpenMV CamのIPアドレスに接続することで、VLCのようなプログラムで動画ストリームを
# 表示できます。また、OpenMV IDEにはFFPLAYベースのRTSPビューアが組み込まれており、
# Tools->Video Tools->Play RSTP Streamから利用できます。

import network
import rtsp
import csi
import time

# LinuxでVLCを使用している場合、RTSPサポートのためにlive555ライブラリを
# インストールする必要があるかもしれません。Ubuntuの場合は以下のコマンドを実行してください:
#
# sudo apt-get install livemedia-utils

# VLCなどのプログラムのレイテンシについて、デフォルトでは通常再生前に1秒分の動画を
# バッファリングするよう設定されています。これを減らすには、以下を使ってネットワークキャッシュを削減する必要があります
# VLCでネットワークストリームを開く際の「詳細オプションを表示」。これを10ms程度まで短縮できます
# 映像をリアルタイムにするために。

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

# ネットワークインターフェースの設定

network_if = network.LAN()
network_if.active(True)
network_if.ifconfig("dhcp")

# RTSPサーバーの設定

server = rtsp.rtsp_server(network_if)

# 以下のコールバック関数について:
#
# `pathname`はクライアントが要求するストリームリソースの名前です。不要であれば無視して構いません
# そうでなければ、これを使ってどの画像オブジェクトを返すか判断できます。デフォルトではパス
# 名は「/」になります。
#
# `session`は新しい接続が確立されるたびに変化するランダムな数値です。これを使って
# 同じファイル名への異なるアクセスを区別するために、sessionを辞書と組み合わせて使用できます。

# 現在のFPSを記録します。
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 ""