Open5
監視カメラの制御メモ
tapo200の制御
tapo200の設定
- 専用アプリ - tapoにカメラ登録
- 高度な設定 - カメラのアカウントにて以下を設定
- ユーザ名 : user
- パスワード : pwd
vlcでの配信
下記の指定で配信可
rtsp://user:pwd@192.168.11.47:554/stream1
=>1080p30で配信
rtsp://user:pwd@192.168.11.47:554/stream1
=>640x340 - 30fpsで配信
iSpyでの配信
に記載されている
pythonからの制御
pantilt制御
にて制御可能
例:windows
> python3 -m venv env
> .\env\Scripts\activate
(env) > pip install --upgrade onvif_zeep
(env) > git clone https://github.com/FalkTannhaeuser/python-onvif-zeep.git
# .\python-onvif-zeep\examples\continuous_move.py
# を使用する、サンプルはasyncが使われており、windowsではエラーとなるため、
# asyncを参照しないように修正する
(env) > python .\continuous_move.py
move_up
move up...
move left...
rtsp clientの制御
- 画像の取得
- pillowの形式で取得される
import rtsp
RTSP_URL = f"rtsp://user:pwd@ipaddress:554/stream1"
client = rtsp.Client(rtsp_server_uri=RTSP_URL, verbose=True)
client.read().show()
client.close()
=>client.read()は、PIL.Imageでかえる
- streamの確認
import rtsp
RTSP_URL = f"rtsp://user:pwd@ipaddress:554/stream1"
# client = rtsp.Client(rtsp_server_uri = 'rtsp://...', verbose=True)
client = rtsp.Client(rtsp_server_uri=RTSP_URL, verbose=True)
client.preview()
client.close()
pysimpleguiでビューア作成
環境
> python3 -m venv env
> env\Scripts\activate
(env) > pip install --upgrade onvif_zeep
(env) > pip install rtsp
(env) > pip install pyautogui
コード
view.py
import PySimpleGUI as sg
import rtsp
from PIL import Image, ImageTk
sg.theme('LightBlue')
USER = "user"
PASS = "pass"
IPADDR = "192.168.11.xxx"
PORT = "554"
STREAM = "stream2"
ONVIF_PORT = "2020"
layout = [
[ sg.Text('Realtime movie', size=(40, 1), justification='center', font='Helvetica 14',key='-status-')],
[ sg.Text('USER: ', size=(12, 1)), sg.InputText(default_text=USER, size=(20, 1),key='-user-'),
sg.Text('PASS: ', size=(12, 1)), sg.InputText(default_text=PASS, size=(20, 1),key='-pass-')],
[ sg.Text('IPADDR: ', size=(12, 1)), sg.InputText(default_text=IPADDR, size=(20, 1),key='-ipaddr-'),
sg.Text('PORT: ', size=(12, 1)), sg.InputText(default_text=PORT, size=(20, 1),key='-port-'),
sg.Text('STREAM: ', size=(12, 1)), sg.InputText(default_text=STREAM, size=(20, 1),key='-stream-')],
[ sg.Text('ONVIF_PORT: ', size=(12, 1)), sg.InputText(default_text=ONVIF_PORT, size=(20, 1),key='-onvif_port-')],
[ sg.Image(filename='', key='image')],
[ sg.Button('Start', size=(10, 1), font='Helvetica 14',key ='-start-'),
sg.Button('Stop', size=(10, 1), font='Helvetica 14',key = '-stop-'),
sg.Button('Exit', size=(10, 1), font='Helvetica 14', key='-exit-'), ],
]
is_streaming = False
window = sg.Window('Realtime movie',layout, location=(32, 32))
while True:
event, values = window.read(timeout=20)
if event in (None, '-exit-'):
break
elif event == '-start-':
window['-status-'].update('Live')
rtsp_url = f"rtsp://{values['-user-']}:{values['-pass-']}@{values['-ipaddr-']}:{values['-port-']}/{values['-stream-']}"
print("rtsp_url:", rtsp_url)
client = rtsp.Client(rtsp_server_uri=rtsp_url, verbose=True)
is_streaming = True
elif event == '-stop-':
window['-status-'].update("Stop")
is_streaming = False
client.close()
img = Image.new("RGB", (640, 360), color=0)
window['image'].update(data=ImageTk.PhotoImage(img))
if is_streaming:
frame = client.read()
if frame is not None:
window['image'].update(data=ImageTk.PhotoImage(frame))
else:
print("none")
window.close()
実行手順
(env) > python view.py
記事にしたのでクローズ
realink - ezoomの接続