Commit 0f9bf0e8 authored by ivan's avatar ivan

Initial commit

parents
FROM ubuntu:18.04
# 更新套件清單
RUN apt-get -y update
# 安裝 systemctl
RUN apt-get install -y systemd
# 安裝 nginx & python3
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y tzdata
RUN ln -fs /usr/share/zoneinfo/Europe/Stockholm /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
RUN apt-get install -y nginx python3-dev python3-pip python3-matplotlib python3-scipy
# 移除套件清單
RUN rm -rf /var/lib/apt/lists/*
# 更新 python3 套件清單
RUN pip3 install --upgrade pip
# 安裝 flask 套件
RUN pip3 install Flask-API flask flask-restful flask-cors flask-jwt-extended
# 安裝 jupyter & uwsgi & docker 套件
RUN pip3 install jupyter uwsgi docker
# 安裝其他套件
RUN pip3 install passlib pytz pypyodbc requests
RUN pip3 install influxdb
# 設定 Flask 編碼與時區
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 TZ=Asia/Taipei
# 設定 Flask Debug 模式參數
ENV FLASK_APP=run.py FLASK_DEBUG=1
# 修改 nginx 設定
RUN echo "server {" > /etc/nginx/sites-available/default
RUN echo " listen 80;" >> /etc/nginx/sites-available/default
RUN echo " server_name localhost;" >> /etc/nginx/sites-available/default
RUN echo " charset utf-8;" >> /etc/nginx/sites-available/default
RUN echo " access_log /notebooks/logs/nginx_access.log;" >> /etc/nginx/sites-available/default
RUN echo " error_log /notebooks/logs/nginx_error.log;" >> /etc/nginx/sites-available/default
RUN echo " client_max_body_size 20M;" >> /etc/nginx/sites-available/default
RUN echo " location / {" >> /etc/nginx/sites-available/default
RUN echo " include /etc/nginx/uwsgi_params;" >> /etc/nginx/sites-available/default
RUN echo " uwsgi_pass unix:/notebooks/uwsgi.sock;" >> /etc/nginx/sites-available/default
RUN echo " }" >> /etc/nginx/sites-available/default
RUN echo "}" >> /etc/nginx/sites-available/default
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install -U flask-cors
# 設定工作執行目錄
VOLUME ["/notebooks"]
#COPY notebooks /notebooks
WORKDIR /notebooks
# 啟動伺服器
CMD service nginx start & uwsgi --ini /notebooks/uwsgi.ini
FROM ubuntu:18.04
# 更新套件清單
RUN apt update
# 安裝 systemctl
RUN apt install -y systemd
# 安裝 nginx
RUN apt install -y nginx
# 修改 nginx 設定
RUN echo "server {" > /etc/nginx/sites-available/default
RUN echo " listen 80;" >> /etc/nginx/sites-available/default
RUN echo " server_name localhost;" >> /etc/nginx/sites-available/default
RUN echo " charset utf-8;" >> /etc/nginx/sites-available/default
RUN echo " access_log /notebooks/log/nginx_access.log;" >> /etc/nginx/sites-available/default
RUN echo " error_log /notebooks/log/nginx_error.log;" >> /etc/nginx/sites-available/default
RUN echo " location / {" >> /etc/nginx/sites-available/default
RUN echo " include /etc/nginx/uwsgi_params;" >> /etc/nginx/sites-available/default
RUN echo " uwsgi_pass unix:/notebooks/uwsgi.sock;" >> /etc/nginx/sites-available/default
RUN echo " }" >> /etc/nginx/sites-available/default
RUN echo "}" >> /etc/nginx/sites-available/default
# 安裝 mssql
RUN apt install -y tdsodbc freetds-dev unixodbc unixodbc-dev
# 修改 mssql 設定
RUN echo "[sqlserver]" > /etc/freetds/freetds.conf
RUN echo " host = ${MSSQL_HOST}" >> /etc/freetds/freetds.conf
RUN echo " port = ${MSSQL_PORT}" >> /etc/freetds/freetds.conf
RUN echo " tds version = ${TDS_VERSION}" >> /etc/freetds/freetds.conf
RUN echo "[sqlserverdatasource]" > /etc/odbc.ini
RUN echo " Driver = FreeTDS" >> /etc/odbc.ini
RUN echo " Description = ODBC connection via FreeTDS" >> /etc/odbc.ini
RUN echo " Servername = sqlserver" >> /etc/odbc.ini
RUN echo " Database = ${MSSQL_DABS}" >> /etc/odbc.ini
RUN echo " TDS_Version = ${TDS_VERSION}" >> /etc/odbc.ini
RUN echo "[ODBC]" > /etc/odbcinst.ini
RUN echo " Trace = Yes" >> /etc/odbcinst.ini
RUN echo " TraceFile = /notebooks/log/odbc.log" >> /etc/odbcinst.ini
RUN echo "[FreeTDS]" >> /etc/odbcinst.ini
RUN echo " Description = TDS driver (Sybase/MS SQL)" >> /etc/odbcinst.ini
RUN echo " Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so" >> /etc/odbcinst.ini
RUN echo " Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
RUN echo " CPTimeout =" >> /etc/odbcinst.ini
RUN echo " CPReuse =" >> /etc/odbcinst.ini
RUN echo " FileUsage = 1" >> /etc/odbcinst.ini
# 安裝 python
RUN apt install -y python3-dev python3-pip
# 移除套件清單
RUN rm -rf /var/lib/apt/lists/*
# 更新 python3 套件清單
RUN pip3 install --upgrade pip
RUN pip3 install Flask-API
# 安裝 flask
RUN pip3 install flask flask-restful flask-cors flask-jwt-extended flask-sqlalchemy flask-mysql
# 安裝其他套件
RUN pip3 install passlib pytz pypyodbc requests
# 安裝 jupyter
RUN pip3 install jupyter
# 安裝 uwsgi
RUN pip3 install uwsgi
# MSSQL 相關參數
# ENV MSSQL_HOST MSSQL_PORT MSSQL_USR MSSQL_PWD MSSQL_DB MSSQL_TDS
# MYSQL 相關參數
# ENV MYSQL_HOST MYSQL_PORT MYSQL_USR MYSQL_PWD MYSQL_DB
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 TZ=Asia/Taipei
ENV FLASK_APP=run.py FLASK_DEBUG=1
# VOLUME ["/notebooks"]
COPY notebooks /notebooks
WORKDIR /notebooks
CMD service nginx start & uwsgi --ini /notebooks/uwsgi.ini
\ No newline at end of file
import pypyodbc as odbc # MS SQL Server
import os as __os, logger as __log
__drive = "DRIVER={FreeTDS};"
__server = "SERVER=" + __os.environ['MSSQL_HOST'] + "," + __os.environ['MSSQL_PORT'] + ";"
__database = "DATABASE=" + __os.environ['MSSQL_DB'] + ';'
__uid = "UID=" + __os.environ['MSSQL_USR'] + ";"
__pwd = "PWD=" + __os.environ['MSSQL_PWD'] + ";"
__version = "TDS_Version=" + __os.environ['MSSQL_TDS'] + ";"
def select(table, columns="*"): # (資料表, 資料欄位)
if isinstance(columns, list): # 查詢特定多個欄位
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + column
else: # 查詢特定或所有欄位
fields = columns
# 從資料表中選出指定欄位的內容
return "SELECT " + fields + " FROM " + table
def insert(table, data): # (資料表, 新增資料)
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + key
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
# 新增資料列到資料表中
return "INSERT INTO " + table + " (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = key + " = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
# 更新特定欄位的內容 `" + table + "` SET " + data_set
return "UPDATE " + table + " SET " + pairs
def delete(table):
return "DELETE FROM " + table
def where(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
_in = (_in + ", " if '_in' in vars() else "") + "'" + value + "'"
else:
_in = "'" + values + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + column + " IN (" + _in + ")"
def where_between(query, column, start, end):
_between = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE " + column + " BETWEEN " + _between
def where_like(query, column, like):
return query + " WHERE " + column + " LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = column + " " + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY " + column + " " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(rows) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone() if "SELECT" in query else True
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(row) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
from flask import Flask as __flask
from flaskext.mysql import MySQL as __mysql
import os as __os, logger as __log
__app = __flask(__name__)
__app.config['MYSQL_DATABASE_HOST'] = __os.environ['MYSQL_HOST']
__app.config['MYSQL_DATABASE_PORT'] = int(__os.environ['MYSQL_PORT'])
__app.config['MYSQL_DATABASE_USER'] = __os.environ['MYSQL_USR']
__app.config['MYSQL_DATABASE_PASSWORD'] = __os.environ['MYSQL_PWD']
__app.config['MYSQL_DATABASE_DB'] = 'chiayi'
__mysql = __mysql()
__mysql.init_app(__app)
def select(table, columns="*"):
if isinstance(columns, list):
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + "`" + column + "`"
else:
fields = "`" + columns + "`"
return "SELECT " + fields + " FROM `" + table + "`"
def insert(table, data):
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + "`" + key + "`"
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
return "INSERT INTO `" + table + "` (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = "`" + key + "` = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
return "UPDATE `" + table + "` SET " + pairs
def delete(table):
return "DELETE FROM `" + table + "`"
def where(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
temp = (temp + ", " if 'temp' in vars() else "") + "'" + value + "'"
else:
temp = "'" + values + "'"
return query + " WHERE `" + column + "` IN (" + temp + ")"
def where_between(query, column, start, end):
temp = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE `" + column + "` BETWEEN " + temp
def where_like(query, column, like):
return query + " WHERE `" + column + "` LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY `" + column + "` " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
import os as __os, datetime as __datetime, pytz as __pytz
import sys as __sys, codecs as __codecs
def write(source, tag, table, message):
now = __datetime.datetime.now(tz=__pytz.timezone('Asia/Taipei'))
now = str(int(now.strftime("%Y%m%d%H%M")) - 191100000000)
date = __os.path.join("log", now[0:3], now[3:5])
# Create log folder if it't exists.
if not __os.path.exists(date):
__os.makedirs(date)
# Record SQL operator per day.
with __codecs.open(__os.path.join(date, now[5:7] + '.log'), "a", "utf-8") as f:
f.write(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + tag + "][" + table + "]:\n" + message + "\n")
# try:
# __sys.stdout = __codecs.getwriter("utf-8")(__sys.stdout.detach())
# except:
# tag = "ERROR"
print(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + table + "]:" + tag)
[uwsgi]
module = run:app
http-socket = 0.0.0.0:5000
processes = 5
chdir = /notebooks
socket = /notebooks/uwsgi.sock
logto = /notebooks/logs/uwsgi.log
chmod-socket = 006
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /notebooks/logs/nginx_access.log;
error_log /notebooks/logs/nginx_error.log;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/notebooks/uwsgi.sock;
}
}
\ No newline at end of file
[sqlserver]
host = ${MSSQL_HOST}
port = ${MSSQL_PORT}
tds version = ${TDS_VERSION}
\ No newline at end of file
[sqlserverdatasource]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Servername = sqlserver
Database = ${MSSQL_DABS}
TDS_Version = ${TDS_VERSION}
\ No newline at end of file
[ODBC]
Trace = Yes
TraceFile = /notebooks/logs/odbc.log
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1
\ No newline at end of file
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
# Install dependencies
RUN pip3 install psutil
RUN apt-get -y update
RUN pip3 install pytz
COPY move_nas.py move_nas.py
CMD python3 move_nas.py
import os,time,sys
import shutil
import stat
def dir_status():
line=[]
with os.scandir('/data') as entries:
for entry in entries:
dir_stat=entry.stat().st_mtime,entry.name
line.append(dir_stat)
line.sort()
c=line.pop(0)
return(c[1])
def copytree(src='/data/{0}'.format(dir_status()), dst='/nas/{0}'.format(dir_status()), symlinks = False, ignore = None):
if not os.path.exists(dst):
os.makedirs(dst)
shutil.copystat(src, dst)
lst = os.listdir(src)
if ignore:
excl = ignore(src, lst)
lst = [x for x in lst if x not in excl]
for item in lst:
s = os.path.join(src, item)
d = os.path.join(dst, item)
if symlinks and os.path.islink(s):
if os.path.lexists(d):
os.remove(d)
os.symlink(os.readlink(s), d)
try:
st = os.lstat(s)
mode = stat.S_IMODE(st.st_mode)
os.lchmod(d, mode)
except:
pass
elif os.path.isdir(s):
copytree(s, d, symlinks, ignore)
else:
shutil.copy2(s, d)
def disk_root():
s=0
disk=os.statvfs('/data')
percent=(disk.f_blocks-disk.f_bfree)*100/(disk.f_blocks-disk.f_bfree+disk.f_bavail)
if percent > 50:
return s==0
else:
return s==1
def restart_program():
python = sys.executable
os.execl(python, python, * sys.argv)
while True:
time.sleep(10)
if disk_root() == True :
try:
copytree()
except IOError as e:
print("Unable to copy file. %s" % e)
except:
print("ERROR")
else:
old_path = r"/data/{0}".format(dir_status())
try:
shutil.rmtree(old_path)
except OSError as e:
print(e)
else:
print("The directory is deleted successfully")
print("program restart !! ")
time.sleep(3)
restart_program()
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:jonathonf/ffmpeg-4
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
COPY replay.py replay.py
RUN mkdir /data
CMD python3 replay.py
#!/usr/bin/env python
# coding: utf-8
import os,time
#import subprocess as sp
from influxdb import InfluxDBClient
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root', 'stream')
fields = """timestamp,save_path,EXTINF"""
measurement = """{}""".format(os.getenv('goup_name'))
filters = """ WHERE time >='{0}'-8h and time <='{1}'-8h """.format(os.getenv('START_DATE'),os.getenv('END_DATE'))
GROUP="""GROUP BY {} """.format("ch")
query = """SELECT {} FROM {} {} {} tz('Asia/Taipei')""".format(fields, measurement, filters,GROUP)
print("Performing a query: {}".format(query))
results= client.query(query)
# 1563984000000ms
#results=client.query('select "timestamp" ,"save_path","EXTINF" FROM "stream"."autogen"."{2}" WHERE time >= {0}ms and time <= {1}ms GROUP BY "ch"'.format(os.getenv('START'),os.getenv('END'),os.getenv('goup_name')))
#results.raw
path="/data/replay/{0}/{1}".format(os.getenv('goup_name'),os.getenv('camera_path'))
isExists=os.path.exists(path)
if not isExists:
os.makedirs(path)
points = list(results.get_points(measurement=os.getenv('goup_name'),tags={'ch':os.getenv('camera_path')}))
for point in points:
m3u8=point['save_path']+point['timestamp']+'.ts'
save_path=point['save_path']
EXTINF=point['EXTINF']
print(m3u8)
def read_data():
start=5
with open("/data/replay/{0}/{1}/replay.m3u8".format(os.getenv('goup_name'),os.getenv('camera_path')), 'w') as f:
try:
data=open("/data/replay/{0}/{1}/replay.m3u8".format(os.getenv('goup_name'),os.getenv('camera_path'))).read()
lines=[]
if (len(data) ==0):
lines.append("#EXTM3U\n")
lines.append("#EXT-X-VERSION:3\n")
lines.append("#EXT-X-MEDIA-SEQUENCE:0\n")
lines.append("#EXT-X-ALLOW-CACHE:NO\n")
lines.append("#EXT-X-TARGETDURATION:11\n")
for l in range(start,len(points),1): #依次讀取每行
if (points[l]['EXTINF']):
lines.append(points[l]['EXTINF'] + "\n")
lines.append("/record/"+(points[l]['save_path']+points[l]['timestamp']).split('/data/')[1]+".ts" +"\n")
finally:
lines.append("#EXT-X-ENDLIST")
f.writelines(lines)
f.flush()
#f.close()
read_data()
#def replay():
#cmd=' ffmpeg -re -i /ISRG106/replay/{0}/replay.m3u8 -c:v copy -an -rtsp_transport tcp -f rtsp rtsp://{1}:{2}/replay/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'),os.getenv('ezd_ip'),os.getenv('ezd_port'))
#return cmd
#cmd=replay()
#p1=sp.Popen(cmd,shell=True)
#p1.communicate()
FROM ubuntu:18.04
RUN apt update
RUN apt install -y wget tar
RUN wget https://github.com/EasyDarwin/EasyDarwin/releases/download/v8.1.0/EasyDarwin-linux-8.1.0-1901141151.tar.gz
RUN tar zxvf EasyDarwin-linux-8.1.0-1901141151.tar.gz
WORKDIR EasyDarwin-linux-8.1.0-1901141151
COPY easydarwin.ini /EasyDarwin-linux-8.1.0-1901141151/easydarwin.ini
CMD ./easydarwin
[http]
port=10008
default_username=admin
default_password=admin
[rtsp]
port=554
; rtsp 超时时间,包括RTSP建立连接与数据收发。
timeout=28800
; 是否使能gop cache。如果使能,服务器会缓存最后一个I帧以及其后的非I帧,以提高播放速度。但是可能在高并发的情况下带来内存压力。
gop_cache_enable=1
; 是否使能向服务器推流或者从服务器播放时验证用户名密码. [注意] 因为服务器端并不保存明文密码,所以推送或者播放时,客户端应该输入密码的md5后的值。
; password should be the hex of md5(original password)
authorization_enable=0
; 是否使能推送的同事进行本地存储,使能后则可以进行录像查询与回放。
save_stream_to_local=0
;easydarwin使用ffmpeg工具来进行存储。这里表示ffmpeg的可执行程序的路径
ffmpeg_path=/Users/ze/Downloads/ffmpeg-20180719-9cb3d8f-macos64-shared/bin/ffmpeg
;本地存储所将要保存的根目录。如果不存在,程序会尝试创建该目录。
m3u8_dir_path=/record
;切片文件时长。本地存储时,将以该时间段为标准来生成ts文件(该时间+一个I帧间隔),单位秒。
;如果需要直播,这个值设小点,但是这样会产生很多ts文件;如果不需要直播,只要存储的话,可设大些。
ts_duration_second=6
;key为拉流时的自定义路径,value为ffmpeg转码格式,比如可设置为-c:v copy -c:a copy,表示copy源格式;default表示使用ffmpeg内置的输出格式,会进行转码。
FROM ubuntu:18.04
RUN apt -y update
RUN apt install -y git python-dev gcc
RUN git clone https://github.com/winlinvip/simple-rtmp-server
WORKDIR /simple-rtmp-server/trunk
RUN ./configure
RUN make
COPY origin.conf conf/srs.conf
# COPY edge.conf conf/edge.conf
ENV TZ=Asia/Taipei
CMD ./objs/srs -c conf/srs.conf
# conf/edge.conf
listen 1935;
max_connections 1000;
pid ./objs/edge.pid;
daemon off;
srs_log_tank ./objs/edge.log;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
cluster {
mode remote;
origin 192.168.5.200;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
# conf/origin.conf
listen 1935;
max_connections 1000;
daemon off;
pid objs/origin.pid;
srs_log_file ./objs/origin.log;
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /data
CMD python3 storage.py
version: '2'
services:
face02:
build: .
environment:
- goup_name=face
- camera_path=02
networks:
lan:
ipv4_address: 192.168.0.61
container_name: face02_storage
restart: always
volumes:
- /data:/data
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -segment_list_flags live -segment_wrap 6 -segment_time 10 -segment_list_size 6 -segment_format mpegts -segment_list /data/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /data/{0}/{2}/%d.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global temp
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/data/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0),
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /data
CMD python3 storage.py
version: '2'
services:
khh01:
build: .
environment:
- goup_name=khh
- camera_path=01
networks:
lan:
ipv4_address: 192.168.0.28
container_name: khh01_storage
restart: always
volumes:
- /data:/data
khh02:
build: .
environment:
- goup_name=khh
- camera_path=02
links:
- khh01
networks:
lan:
ipv4_address: 192.168.0.29
container_name: khh02_storage
restart: always
volumes:
- /data:/data
khh03:
build: .
environment:
- goup_name=khh
- camera_path=03
links:
- khh02
networks:
lan:
ipv4_address: 192.168.0.30
container_name: khh03_storage
restart: always
volumes:
- /data:/data
khh04:
build: .
environment:
- goup_name=khh
- camera_path=04
links:
- khh03
networks:
lan:
ipv4_address: 192.168.0.31
container_name: khh04_storage
restart: always
volumes:
- /data:/data
khh05:
build: .
environment:
- goup_name=khh
- camera_path=05
links:
- khh04
networks:
lan:
ipv4_address: 192.168.0.32
container_name: khh05_storage
restart: always
volumes:
- /data:/data
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -strftime 1 -segment_list_flags live -segment_time 10 -segment_list_size 0 -segment_format mpegts -segment_list /data/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /data/{0}/{2}/%s.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/data/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0),
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /data
CMD python3 storage.py
version: '2'
services:
rd01:
build: .
environment:
- goup_name=rd
- camera_path=01
networks:
lan:
ipv4_address: 192.168.0.33
container_name: rd01_storage
restart: always
volumes:
- /data:/data
rd02:
build: .
environment:
- goup_name=rd
- camera_path=02
links:
- rd01
networks:
lan:
ipv4_address: 192.168.0.34
container_name: rd02_storage
restart: always
volumes:
- /data:/data
rd03:
build: .
environment:
- goup_name=rd
- camera_path=03
links:
- rd02
networks:
lan:
ipv4_address: 192.168.0.35
container_name: rd03_storage
restart: always
volumes:
- /data:/data
rd04:
build: .
environment:
- goup_name=rd
- camera_path=04
links:
- rd03
networks:
lan:
ipv4_address: 192.168.0.36
container_name: rd04_storage
restart: always
volumes:
- /data:/data
rd05:
build: .
environment:
- goup_name=rd
- camera_path=05
links:
- rd04
networks:
lan:
ipv4_address: 192.168.0.37
container_name: rd05_storage
restart: always
volumes:
- /data:/data
rd06:
build: .
environment:
- goup_name=rd
- camera_path=06
links:
- rd05
networks:
lan:
ipv4_address: 192.168.0.38
container_name: rd06_storage
restart: always
volumes:
- /data:/data
rd07:
build: .
environment:
- goup_name=rd
- camera_path=07
links:
- rd06
networks:
lan:
ipv4_address: 192.168.0.39
container_name: rd07_storage
restart: always
volumes:
- /data:/data
rd08:
build: .
environment:
- goup_name=rd
- camera_path=08
links:
- rd07
networks:
lan:
ipv4_address: 192.168.0.40
container_name: rd08_storage
restart: always
volumes:
- /data:/data
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -segment_list_flags live -segment_wrap 6 -segment_time 10 -segment_list_size 6 -segment_format mpegts -segment_list /data/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /data/{0}/{2}/%d.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global temp
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/data/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0),
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /data
CMD python3 storage.py
version: '2'
services:
txg01:
build: .
environment:
- goup_name=txg
- camera_path=01
networks:
lan:
ipv4_address: 192.168.0.10
container_name: txg01_storage
restart: always
volumes:
- /data:/data
txg02:
build: .
environment:
- goup_name=txg
- camera_path=02
links:
- txg01
networks:
lan:
ipv4_address: 192.168.0.11
container_name: txg02_storage
restart: always
volumes:
- /data:/data
txg03:
build: .
environment:
- goup_name=txg
- camera_path=03
links:
- txg02
networks:
lan:
ipv4_address: 192.168.0.12
container_name: txg03_storage
restart: always
volumes:
- /data:/data
txg04:
build: .
environment:
- goup_name=txg
- camera_path=04
links:
- txg03
networks:
lan:
ipv4_address: 192.168.0.13
container_name: txg04_storage
restart: always
volumes:
- /data:/data
txg05:
build: .
environment:
- goup_name=txg
- camera_path=05
links:
- txg04
networks:
lan:
ipv4_address: 192.168.0.14
container_name: txg05_storage
restart: always
volumes:
- /data:/data
txg06:
build: .
environment:
- goup_name=txg
- camera_path=06
links:
- txg05
networks:
lan:
ipv4_address: 192.168.0.15
container_name: txg06_storage
restart: always
volumes:
- /data:/data
txg07:
build: .
environment:
- goup_name=txg
- camera_path=07
links:
- txg06
networks:
lan:
ipv4_address: 192.168.0.16
container_name: txg07_storage
restart: always
volumes:
- /data:/data
txg08:
build: .
environment:
- goup_name=txg
- camera_path=08
links:
- txg07
networks:
lan:
ipv4_address: 192.168.0.17
container_name: txg08_storage
restart: always
volumes:
- /data:/data
txg09:
build: .
environment:
- goup_name=txg
- camera_path=09
links:
- txg08
networks:
lan:
ipv4_address: 192.168.0.18
container_name: txg09_storage
restart: always
volumes:
- /data:/data
txg10:
build: .
environment:
- goup_name=txg
- camera_path=10
links:
- txg09
networks:
lan:
ipv4_address: 192.168.0.19
container_name: txg10_storage
restart: always
volumes:
- /data:/data
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -strftime 1 -segment_list_flags live -segment_time 10 -segment_list_size 0 -segment_format mpegts -segment_list /data/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /data/{0}/{2}/%s.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/data/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0)
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /data
CMD python3 storage.py
version: '2'
services:
tyc01:
build: .
environment:
- goup_name=tyc
- camera_path=01
networks:
lan:
ipv4_address: 192.168.0.20
container_name: tyc01_storage
restart: always
volumes:
- /data:/data
tyc02:
build: .
environment:
- goup_name=tyc
- camera_path=02
links:
- tyc01
networks:
lan:
ipv4_address: 192.168.0.21
container_name: tyc02_storage
restart: always
volumes:
- /data:/data
tyc03:
build: .
environment:
- goup_name=tyc
- camera_path=03
links:
- tyc02
networks:
lan:
ipv4_address: 192.168.0.22
container_name: tyc03_storage
restart: always
volumes:
- /data:/data
tyc04:
build: .
environment:
- goup_name=tyc
- camera_path=04
links:
- tyc03
networks:
lan:
ipv4_address: 192.168.0.23
container_name: tyc04_storage
restart: always
volumes:
- /data:/data
tyc05:
build: .
environment:
- goup_name=tyc
- camera_path=05
links:
- tyc04
networks:
lan:
ipv4_address: 192.168.0.24
container_name: tyc05_storage
restart: always
volumes:
- /data:/data
tyc06:
build: .
environment:
- goup_name=tyc
- camera_path=06
links:
- tyc05
networks:
lan:
ipv4_address: 192.168.0.25
container_name: tyc06_storage
restart: always
volumes:
- /data:/data
tyc07:
build: .
environment:
- goup_name=tyc
- camera_path=07
links:
- tyc06
networks:
lan:
ipv4_address: 192.168.0.26
container_name: tyc07_storage
restart: always
volumes:
- /data:/data
tyc08:
build: .
environment:
- goup_name=tyc
- camera_path=08
links:
- tyc07
networks:
lan:
ipv4_address: 192.168.0.27
container_name: tyc08_storage
restart: always
volumes:
- /data:/data
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -strftime 1 -segment_list_flags live -segment_time 10 -segment_list_size 0 -segment_format mpegts -segment_list /data/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /data/{0}/{2}/%s.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/data/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0),
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
temp=''
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/data/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/data/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y python3-dev python3-pip libsm6 libxrender1 libxext-dev
RUN apt-get -y install software-properties-common
RUN rm -r /var/lib/apt/lists/*
RUN pip3 install --upgrade pip
RUN pip3 install websocket-client==0.40.0
# Install dependencies
RUN pip3 install influxdb
RUN pip3 install psutil
RUN apt-get -y update
RUN apt-get -y install ffmpeg
RUN pip3 install pytz
RUN apt-get -y install cifs-utils
COPY storage.py storage.py
RUN mkdir /wgs
CMD python3 storage.py
version: '2'
services:
wgs01:
build: .
environment:
- goup_name=wgs
- camera_path=01
networks:
lan:
ipv4_address: 192.168.0.52
container_name: wgs01_storage
restart: always
volumes:
- /wgs:/wgs
wgs02:
build: .
environment:
- goup_name=wgs
- camera_path=02
links:
- wgs01
networks:
lan:
ipv4_address: 192.168.0.53
container_name: wgs02_storage
restart: always
volumes:
- /wgs:/wgs
wgs03:
build: .
environment:
- goup_name=wgs
- camera_path=03
links:
- wgs02
networks:
lan:
ipv4_address: 192.168.0.54
container_name: wgs03_storage
restart: always
volumes:
- /wgs:/wgs
wgs04:
build: .
environment:
- goup_name=wgs
- camera_path=04
links:
- wgs03
networks:
lan:
ipv4_address: 192.168.0.55
container_name: wgs04_storage
restart: always
volumes:
- /wgs:/wgs
wgs05:
build: .
environment:
- goup_name=wgs
- camera_path=05
links:
- wgs04
networks:
lan:
ipv4_address: 192.168.0.56
container_name: wgs05_storage
restart: always
volumes:
- /wgs:/wgs
wgs06:
build: .
environment:
- goup_name=wgs
- camera_path=06
links:
- wgs05
networks:
lan:
ipv4_address: 192.168.0.57
container_name: wgs06_storage
restart: always
volumes:
- /wgs:/wgs
wgs07:
build: .
environment:
- goup_name=wgs
- camera_path=07
links:
- wgs06
networks:
lan:
ipv4_address: 192.168.0.58
container_name: wgs07_storage
restart: always
volumes:
- /wgs:/wgs
wgs08:
build: .
environment:
- goup_name=wgs
- camera_path=08
links:
- wgs07
networks:
lan:
ipv4_address: 192.168.0.59
container_name: wgs08_storage
restart: always
volumes:
- /wgs:/wgs
wgs09:
build: .
environment:
- goup_name=wgs
- camera_path=09
links:
- wgs08
networks:
lan:
ipv4_address: 192.168.0.60
container_name: wgs09_storage
restart: always
volumes:
- /wgs:/wgs
networks:
lan:
external:
name: shuochen_net
import time,os,signal
import subprocess as sp
from influxdb import InfluxDBClient
import datetime
import psutil
import pytz
from datetime import timedelta
rtspUrl='rtsp://192.168.5.208/{0}'.format(os.getenv('goup_name')+"/"+os.getenv('camera_path'))
client = InfluxDBClient('192.168.0.6', 8086, 'root', 'root','stream')
client.create_database('stream')
def switch(startDay,rtspUrl):
command = 'ffmpeg -fflags nobuffer -rtsp_transport tcp -i {1} -vsync 0 -copyts -c:v copy -movflags frag_keyframe+empty_moov -an -f segment -strftime 1 -segment_list_flags live -segment_time 10 -segment_list_size 0 -segment_format mpegts -segment_list /wgs/{0}/{2}/index.m3u8 -segment_list_type m3u8 -segment_list_entry_prefix /record/{0}/{2}/ /wgs/{0}/{2}/%s.ts'.format(startDay,rtspUrl,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
return command
tz=pytz.timezone('Asia/Taipei')
startDay=datetime.datetime.now(tz).date()
def mkdir(path):
#引入模組
#去除首位空格
path=path.strip()
#去除尾部 \ 符號
path=path.rstrip("\\")
#判斷路徑是否存在
#存在True
#不存在False
isExists=os.path.exists(path)
#判斷結果
if not isExists:
#如果不存在則建立目錄
#建立目錄操作函式
os.makedirs(path)
print (path+'success')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print (path+'Directory already exists')
return False
# In[6]:
def read_data():
global lines
global timestamp
global result
global EXTINF
start=lines
try:
time.sleep(5)
with open(('/wgs/{0}/{1}/index.m3u8').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))) as f:
data=f.readlines()
for l in range(start,len(data),1): #依次讀取每行
line=data[l].strip() #去掉每行頭尾空白
lines+=1
print('==========',l)
if line.startswith('#EXTINF'): #判斷是否是空行或註解
EXTINF.append(line)
print(EXTINF)
continue #是的話,跳過不處理
elif line.startswith('#EXT-X-ENDLIST'):
continue
else:
timestamp=line.split(('/record/{0}/{1}/').format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))[1].split('.ts')[0]
timestamp_data=int(timestamp)
result.append(timestamp_data)
print(result)
json_body = [
{
"measurement": os.getenv('goup_name'),
"tags":{
"host": "RD",
"ch": os.getenv('camera_path'),
},
"fields":{
"save_path":mkpath,
"timestamp_data":result.pop(0),
"EXTINF":EXTINF.pop(0),
}
}
]
client.write_points(json_body)
print(json_body)
print('success update to influxdb')
client.close()
except IOError as e:
print(e)
# In[7]:
mkpath="/wgs/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
# 呼叫函式
mkdir(mkpath)
lines=5
timestamp=''
result = list()
EXTINF = list()
cp =None
while True:
if (cp!=None and status==None):
read_data()
cp.poll()
status=cp.returncode
if (startDay!= datetime.datetime.now(tz).date()):
startDay=datetime.datetime.now(tz).date()
command=switch(startDay,rtspUrl)
pp=sp.Popen(command,shell=True)
lines=5
mkpath="/wgs/{0}/{1}/".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
mkdir(mkpath)
try:
#psutil.Process(cp.pid)
#cp.terminate() #or
#cp.kill()
os.kill(cp.pid+1,signal.SIGTERM)
time.sleep(1)
cp=pp
time.sleep(1)
cp.poll()
status=cp.returncode
except psutil.NoSuchProcess as e:
print(e)
else:
filepath ="/wgs/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path')))
m3u8_isExists=os.path.isfile(filepath)
if m3u8_isExists:
os.remove("/wgs/{0}/{1}/index.m3u8".format(startDay,(os.getenv('goup_name')+"/"+os.getenv('camera_path'))))
lines=5
command=switch(startDay,rtspUrl)
cp=sp.Popen(command,shell=True)
time.sleep(1)
cp.poll()
status=cp.returncode
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