Open5

監視カメラの制御メモ

kotaprojkotaproj

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での配信

https://www.tp-link.com/jp/support/faq/2680/

に記載されている

pythonからの制御

pantilt制御

https://github.com/FalkTannhaeuser/python-onvif-zeep
にて制御可能

例: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()
kotaprojkotaproj

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