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

Update run.py

parent e0308e48
import paho.mqtt.client as mqtt, subprocess as sp, os, time, json
topic = os.getenv('DVR_TAG') + "/" + os.getenv('SRS_CH')
rtsp = "rtsp://" + os.getenv('DVR_USER') + ":" + os.getenv('DVR_PSWD') # DVR 使用者認證
rtsp = rtsp + "@" + os.getenv('DVR_HOST') # DVR 位址
rtsp = rtsp + "/" + os.getenv('DVR_TYPE') + "_" + os.getenv('DVR_CH') # DVR 串流
rtmp = "rtmp://" + os.getenv('SRS_HOST') + ":" + os.getenv('SRS_PORT') # SRS 位址
rtmp = rtmp + "/live/" + topic # SRS 串流
import json, os, socket, time, subprocess as SP
from paho.mqtt.client import Client as MQTT
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
user = os.getenv("DVR_USER") or "admin"
pswd = os.getenv("DVR_PSWD") or "ecom2828"
cmd = [
'ffmpeg', '-rtsp_transport', 'tcp', # RTSP to RTMP 轉發
'-i', rtsp, # DVR 連結
'-c:v', 'copy', # 相同影像格式
'-an', # 無聲音
'-f', 'flv', rtmp, # SRS 連結
]
name = os.getenv("DVR_NAME") or "rd"
# 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:
p = sp.Popen(cmd, stderr=sp.PIPE)
while p.returncode == None:
t = time.strftime("[%Y/%m/%d][%H:%M:%S][" + str(p.pid) + "]")
host = os.getenv("MQTT_HOST") or "192.168.5.217"
if not p.stderr.isatty():
err = p.stderr.readline()
err = str(err, encoding='utf-8') if len(err) > 0 else ""
port = os.getenv("MQTT_PORT") or "1883"
print("Connect to MQTT")
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:
print(t + " > I: " + err[index1:index2])
port = os.getenv("ED_PORT") or "554"
if TryConnect(host, port): # 測試連線到 EasyDarwin
payload['host'] = host
rtsp_out = "rtsp://{0}:{1}".format(host, port)
if 'Output' in err and index2 > index1:
print(t + " > O: " + err[index1:index2])
host = os.getenv("DVR_HOST") or "192.168.5.198"
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:
print(t)
time.sleep(1)
while False:
p = sp.Popen(cmd)
payload['msg'] = "Connect to EasyDarwin is refused."
while p.returncode == None:
data['status'] = 1
time.sleep(os.getenv('INTERVAL'))
payload['status'] = 0
data['status'] = 0
\ No newline at end of file
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