Commit 33b23458 authored by 簡碩辰's avatar 簡碩辰

Update run.py

parent e0308e48
import paho.mqtt.client as mqtt, subprocess as sp, os, time, json import json, os, socket, time, subprocess as SP
from paho.mqtt.client import Client as MQTT
topic = os.getenv('DVR_TAG') + "/" + os.getenv('SRS_CH') def TryConnect(host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, int(port)))
s.shutdown(socket.SHUT_RDWR)
return True
except ConnectionRefusedError:
print("Connect to {0}:{1} is refused.".format(host, port))
except:
print("Error with unknown problem.")
return False
rtsp = "rtsp://" + os.getenv('DVR_USER') + ":" + os.getenv('DVR_PSWD') # DVR 使用者認證 user = os.getenv("DVR_USER") or "admin"
rtsp = rtsp + "@" + os.getenv('DVR_HOST') # DVR 位址 pswd = os.getenv("DVR_PSWD") or "ecom2828"
rtsp = rtsp + "/" + os.getenv('DVR_TYPE') + "_" + os.getenv('DVR_CH') # DVR 串流 name = os.getenv("DVR_NAME") or "rd"
rtmp = "rtmp://" + os.getenv('SRS_HOST') + ":" + os.getenv('SRS_PORT') # SRS 位址 key = os.getenv("DVR_KEY") or "main_4"
rtmp = rtmp + "/live/" + topic # SRS 串流 topic = "dvr/{0}/{1}".format(name, key)
cmd = [ payload = { 'status': 0, 'host': "", 'name': name, 'key': key, 'msg': "" }
'ffmpeg', '-rtsp_transport', 'tcp', # RTSP to RTMP 轉發
'-i', rtsp, # DVR 連結
'-c:v', 'copy', # 相同影像格式
'-an', # 無聲音
'-f', 'flv', rtmp, # SRS 連結
]
# client = mqtt.Client(client_id=os.getenv('DVR_TAG')) while True:
host = os.getenv("MQTT_HOST") or "192.168.5.217"
# client.connect(os.getenv('MQTT')) port = os.getenv("MQTT_PORT") or "1883"
# data = { 'status' : 0, 'rtsp' : rtsp, 'rtmp' : rtmp } print("Connect to MQTT")
while True: if TryConnect(host, port): # 測試連線到 MQTT
p = sp.Popen(cmd, stderr=sp.PIPE) client = MQTT()
while p.returncode == None: client.connect(host, int(port), 3600)
t = time.strftime("[%Y/%m/%d][%H:%M:%S][" + str(p.pid) + "]")
if not p.stderr.isatty(): host = os.getenv("ED_HOST") or "192.168.5.208"
err = p.stderr.readline() port = os.getenv("ED_PORT") or "554"
err = str(err, encoding='utf-8') if len(err) > 0 else "" if TryConnect(host, port): # 測試連線到 EasyDarwin
payload['host'] = host
index1 = (err.index("'") + 1) if "'" in err else 0 rtsp_out = "rtsp://{0}:{1}".format(host, port)
index2 = (err.index("'", index1)) if "'" in err else 0 host = os.getenv("DVR_HOST") or "192.168.5.198"
if 'Input' in err and index2 > index1: port = os.getenv("DVR_PORT") or "80"
print(t + " > I: " + err[index1:index2])
if 'Output' in err and index2 > index1: if TryConnect(host, port): # 測試連線到 DVR
print(t + " > O: " + err[index1:index2]) rtsp_out = "{0}/{1}/{2}".format(rtsp_out, name, key)
p.stderr.flush() rtsp_in = "rtsp://{0}:{1}@{2}".format(user, pswd, host)
else: rtsp_in = rtsp_in if port == "80" else "{0}:{1}".format(rtsp_in, port)
rtsp_in = "{0}/{1}".format(rtsp_in, key)
p = SP.Popen([
'ffmpeg', # DVR to EasyDarwin
'-rtsp_transport', 'tcp', # 指定來源協定
'-i', rtsp_in, # 指定來源路徑
'-c:v', 'copy', # 指定輸出影像編碼
'-an', # 指定輸出聲音編碼 (an: 無聲音)
'-rtsp_transport', 'tcp', # 指定輸出協定
'-f','rtsp', rtsp_out, # 指定輸出格式與路徑
])
try:
payload['status'] = 1
payload['msg'] = 'Ready to Transfer.'
client.publish(topic, json.dumps(payload), 1)
print(t) p.communicate()
time.sleep(1) payload['status'] = 0
while False: payload['msg'] = 'Popen is closed.'
p = sp.Popen(cmd)
while p.returncode == None: client.publish(topic, json.dumps(payload), 1)
data['status'] = 1 except Exception as e:
payload['status'] = 0
time.sleep(os.getenv('INTERVAL')) payload['msg'] = e
data['status'] = 0 client.publish(topic, json.dumps(payload), 1)
\ No newline at end of file else:
payload['msg'] = "Connect to DVR is refused."
payload['status'] = 0
client.publish(topic, json.dumps(payload), 1)
else:
payload['msg'] = "Connect to EasyDarwin is refused."
payload['status'] = 0
client.publish(topic, json.dumps(payload), 1)
else:
print("Connect to MQTT is refused.")
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment