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):
rtsp = "rtsp://" + os.getenv('DVR_USER') + ":" + os.getenv('DVR_PSWD') # DVR 使用者認證 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
rtsp = rtsp + "@" + os.getenv('DVR_HOST') # DVR 位址 s.connect((host, int(port)))
s.shutdown(socket.SHUT_RDWR)
rtsp = rtsp + "/" + os.getenv('DVR_TYPE') + "_" + os.getenv('DVR_CH') # DVR 串流 return True
except ConnectionRefusedError:
rtmp = "rtmp://" + os.getenv('SRS_HOST') + ":" + os.getenv('SRS_PORT') # SRS 位址 print("Connect to {0}:{1} is refused.".format(host, port))
except:
rtmp = rtmp + "/live/" + topic # SRS 串流 print("Error with unknown problem.")
return False
user = os.getenv("DVR_USER") or "admin"
pswd = os.getenv("DVR_PSWD") or "ecom2828"
cmd = [ name = os.getenv("DVR_NAME") or "rd"
'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')) key = os.getenv("DVR_KEY") or "main_4"
# client.connect(os.getenv('MQTT')) topic = "dvr/{0}/{1}".format(name, key)
# data = { 'status' : 0, 'rtsp' : rtsp, 'rtmp' : rtmp } payload = { 'status': 0, 'host': "", 'name': name, 'key': key, 'msg': "" }
while True: while True:
p = sp.Popen(cmd, stderr=sp.PIPE) host = os.getenv("MQTT_HOST") or "192.168.5.217"
while p.returncode == None:
t = time.strftime("[%Y/%m/%d][%H:%M:%S][" + str(p.pid) + "]")
if not p.stderr.isatty(): port = os.getenv("MQTT_PORT") or "1883"
err = p.stderr.readline() print("Connect to MQTT")
err = str(err, encoding='utf-8') if len(err) > 0 else "" if TryConnect(host, port): # 測試連線到 MQTT
client = MQTT()
index1 = (err.index("'") + 1) if "'" in err else 0 client.connect(host, int(port), 3600)
index2 = (err.index("'", index1)) if "'" in err else 0 host = os.getenv("ED_HOST") or "192.168.5.208"
if 'Input' in err and index2 > index1: port = os.getenv("ED_PORT") or "554"
print(t + " > I: " + err[index1:index2])
if TryConnect(host, port): # 測試連線到 EasyDarwin
payload['host'] = host
rtsp_out = "rtsp://{0}:{1}".format(host, port)
if 'Output' in err and index2 > index1: host = os.getenv("DVR_HOST") or "192.168.5.198"
print(t + " > O: " + err[index1:index2])
p.stderr.flush() port = os.getenv("DVR_PORT") or "80"
if TryConnect(host, port): # 測試連線到 DVR
rtsp_out = "{0}/{1}/{2}".format(rtsp_out, name, key)
rtsp_in = "rtsp://{0}:{1}@{2}".format(user, pswd, host)
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)
p.communicate()
payload['status'] = 0
payload['msg'] = 'Popen is closed.'
client.publish(topic, json.dumps(payload), 1)
except Exception as e:
payload['status'] = 0
payload['msg'] = e
client.publish(topic, json.dumps(payload), 1)
else:
payload['msg'] = "Connect to DVR is refused."
payload['status'] = 0
client.publish(topic, json.dumps(payload), 1)
else: else:
payload['msg'] = "Connect to EasyDarwin is refused."
print(t)
time.sleep(1)
while False:
p = sp.Popen(cmd)
while p.returncode == None: payload['status'] = 0
data['status'] = 1
time.sleep(os.getenv('INTERVAL'))
data['status'] = 0 client.publish(topic, json.dumps(payload), 1)
\ No newline at end of file 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