rtsp_video_server_wlan.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.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`は新しい接続が確立されるたびに変化するランダムな数値です。これを使って
# 同じファイル名への異なるアクセスを区別するために、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)