|
@@ -0,0 +1,472 @@
|
|
|
+import time
|
|
|
+import os
|
|
|
+import _thread as thread
|
|
|
+import cv2
|
|
|
+import sys
|
|
|
+
|
|
|
+from optparse import OptionParser
|
|
|
+
|
|
|
+parser = OptionParser()
|
|
|
+parser.add_option("", "--videoplayer", dest="videoplayer",#default=1,
|
|
|
+ help="enable videoplayer") #, metavar="FILE")
|
|
|
+(options, args) = parser.parse_args()
|
|
|
+
|
|
|
+PLAYLIST = []
|
|
|
+play_list = "/home/user/LibreLight/video/" #.format(path)
|
|
|
+
|
|
|
+def open_playlist():
|
|
|
+ print()
|
|
|
+ print("======== OPEN PLAYLIST DIR !!",play_list)
|
|
|
+
|
|
|
+ if not os.path.isdir(play_list):
|
|
|
+ os.system("mkdir -p {}".format(play_list))
|
|
|
+
|
|
|
+ _lines = os.listdir(play_list)
|
|
|
+ _lines.sort()
|
|
|
+
|
|
|
+ lines = ['']*25 # first is empty
|
|
|
+ i=0
|
|
|
+ for l in _lines:
|
|
|
+ #print(">> ",l.strip(),len(lines))
|
|
|
+ l = l.strip()
|
|
|
+ if "_" in l:
|
|
|
+ ll = l.split("_",1)
|
|
|
+ print(">> ",ll)
|
|
|
+ #ll = int(ll)
|
|
|
+ try:
|
|
|
+ lll = int(ll[0])
|
|
|
+ #lines.append(l.strip())
|
|
|
+ lines[lll] = l
|
|
|
+ except:pass
|
|
|
+
|
|
|
+ if len(lines) <= 10:
|
|
|
+ for i in range(10-len(lines)):
|
|
|
+ lines.append("")#"LINE ERROR")
|
|
|
+ return lines
|
|
|
+
|
|
|
+PLAYLIST_TIME = time.time()
|
|
|
+PLAYLIST = open_playlist()
|
|
|
+
|
|
|
+def rescale_frame2(frame, width):
|
|
|
+ height = int(frame.shape[0]/frame.shape[1] * width )
|
|
|
+ dim = (width, height)
|
|
|
+ return cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
|
|
|
+
|
|
|
+def rescale_frame(frame, percent=75):
|
|
|
+ width = int(frame.shape[1] * percent/ 100)
|
|
|
+ height = int(frame.shape[0] * percent/ 100)
|
|
|
+ dim = (width, height)
|
|
|
+ return cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
|
|
|
+
|
|
|
+class Vopen2():
|
|
|
+ def __init__(self,dmx=None,_id=None):
|
|
|
+ self.buffer = []
|
|
|
+ self._run = 0
|
|
|
+ self.fps = 1
|
|
|
+ self.scale = 1
|
|
|
+ self.fpath = "/home/user/LibreLight/video/"
|
|
|
+ self.fname = "xx.mp4"
|
|
|
+ self.cv2 = cv2
|
|
|
+ self.dim = 0
|
|
|
+ self.dmx = 0
|
|
|
+ self.Rsuccess = 1
|
|
|
+ self.Rcap = None
|
|
|
+ self._video_nr=-1
|
|
|
+ self._init()
|
|
|
+ def next(self):
|
|
|
+ pass
|
|
|
+ def buf_size(self):
|
|
|
+ sizeof = 0
|
|
|
+ for i in self.buffer:
|
|
|
+ sizeof += sys.getsizeof(i)
|
|
|
+
|
|
|
+ #sizeof = sys.getsizeof(self.buffer)
|
|
|
+ sizeof = sizeof/8/1024
|
|
|
+ sizeof = sizeof/100 # gets real mb
|
|
|
+ sizeof = int(sizeof)
|
|
|
+ return sizeof
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ sizeof = self.buf_size()
|
|
|
+
|
|
|
+ return "< id:{}.. buf:{} run:{} fps:{} scale:{} name:{} sof:{}>".format(
|
|
|
+ int(id(self)/10000000),len(self.buffer),self._run,self.fps,self.scale
|
|
|
+ ,self.fname,sizeof
|
|
|
+ )
|
|
|
+
|
|
|
+ def select_video(self,dmx_value):
|
|
|
+ print()
|
|
|
+ print(self,"select_video()",dmx_value)
|
|
|
+ try:
|
|
|
+ dmx_value = int(dmx_value/10)
|
|
|
+
|
|
|
+ if self._video_nr != dmx_value:
|
|
|
+ self._video_nr = dmx_value
|
|
|
+
|
|
|
+ if self._video_nr < len(PLAYLIST):
|
|
|
+ self.fname = str(PLAYLIST[self._video_nr])
|
|
|
+ print("- fname:",self.fname)
|
|
|
+ self._init()
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print("Vopen.select_video()",dmx_value,e)
|
|
|
+
|
|
|
+ def _init(self):
|
|
|
+ print(self)
|
|
|
+ print("videoplayer.init()",self.fpath,self.fname)
|
|
|
+
|
|
|
+ if not os.path.isfile(self.fpath+self.fname):
|
|
|
+ print("-- video file does not exits !! >",self.fpath,self.fname)
|
|
|
+ print()
|
|
|
+
|
|
|
+ self.Rsuccess = 0
|
|
|
+ if self.cv2:
|
|
|
+ self.Rcap = self.cv2.VideoCapture(self.fpath+self.fname, cv2.CAP_FFMPEG)
|
|
|
+ self.Rcap.read()
|
|
|
+ self.Rsuccess = 1
|
|
|
+ self._read()
|
|
|
+
|
|
|
+
|
|
|
+ def _read(self):
|
|
|
+ success = self.Rsuccess
|
|
|
+ ok = 0
|
|
|
+ if success and self.fname:
|
|
|
+ cap = self.Rcap
|
|
|
+ _break = 0
|
|
|
+
|
|
|
+ try:
|
|
|
+ success, img = cap.read()
|
|
|
+ if not success:
|
|
|
+ self.Rcap.release()
|
|
|
+ self.Rcap.retrieve()
|
|
|
+ self.end = 1
|
|
|
+ return
|
|
|
+
|
|
|
+ if self.fps == 0:
|
|
|
+ self.fps = cap.get(cv2.CAP_PROP_FPS)
|
|
|
+
|
|
|
+ img = self.cv2.cvtColor(img, self.cv2.COLOR_BGR2RGB)
|
|
|
+ img = rescale_frame2(img, 200) # 1MB -> 45MB, saves MEMORY / RAM
|
|
|
+ #img = rescale_frame2(img, 400) # 1MB -> 215MB
|
|
|
+
|
|
|
+ # store frame into buffer list
|
|
|
+ self.buffer.append(img)
|
|
|
+ ok = 1
|
|
|
+ if len(self.buffer) % 100 == 0:
|
|
|
+ _id = str(self.__repr__)[-5:-1]
|
|
|
+ print(_id,"video read",self.dmx,len(self.buffer),self.fname,"fps",self.fps,self.dim)
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print("Excetpion","_init",self,e,end="")
|
|
|
+ self.success = 1
|
|
|
+ return ok
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+import sys
|
|
|
+sys.path.insert(0,"../lib/")
|
|
|
+
|
|
|
+
|
|
|
+if len(sys.argv) > 1 and sys.argv[1] == "client":
|
|
|
+ pass
|
|
|
+else:
|
|
|
+ sstart = time.time()
|
|
|
+ #v=Vopen()
|
|
|
+ v=Vopen2()
|
|
|
+
|
|
|
+ #input("start ?")
|
|
|
+ v.select_video(20)
|
|
|
+ #v.select_video(30)
|
|
|
+ b1 = -1
|
|
|
+ b2 = 0
|
|
|
+ #for i in range(100):
|
|
|
+ i=0
|
|
|
+ print()
|
|
|
+ while 1:
|
|
|
+ v._read()
|
|
|
+ #print(i,v)
|
|
|
+ if b1 == len(v.buffer):
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ b1 = len(v.buffer)
|
|
|
+ i+=1
|
|
|
+
|
|
|
+
|
|
|
+ print(i,v)
|
|
|
+ v.next()
|
|
|
+
|
|
|
+ stime = time.time() - sstart
|
|
|
+ l = len(v.buffer)
|
|
|
+ print("frames",l,"fps:",int(l/stime))
|
|
|
+
|
|
|
+ print(len(v.buffer),v)
|
|
|
+ #input("end")
|
|
|
+
|
|
|
+
|
|
|
+# ----------------------
|
|
|
+
|
|
|
+import socket
|
|
|
+import sys
|
|
|
+import time
|
|
|
+
|
|
|
+
|
|
|
+class tcp_sender(object):
|
|
|
+ def __init__(self,port=50000):
|
|
|
+ self.port = port
|
|
|
+ self.buffer = []
|
|
|
+ self.connect()
|
|
|
+ self.loop()
|
|
|
+
|
|
|
+ def connect(self,client_name="unkown"):
|
|
|
+ self.xip = "127.0.0.1" #raw_input("IP-Adresse: ")
|
|
|
+ self.xs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
+ try:
|
|
|
+ self.xs.connect((self.xip, self.port)) #50000))
|
|
|
+ except ConnectionRefusedError as e:
|
|
|
+ print("ConnectionRefusedError: ", "ERR: {0} ".format(e.args) ,end="")
|
|
|
+ print("Server nicht ereichbar/unterbrochen")
|
|
|
+ time.sleep(1)
|
|
|
+ self.connect()
|
|
|
+ print("connected !")
|
|
|
+
|
|
|
+ def read(self):
|
|
|
+ #client.setblocking(0)
|
|
|
+ x=[]
|
|
|
+ out = 0
|
|
|
+ while 1:
|
|
|
+ _x = self.xs.recv(1)
|
|
|
+ if b'\x0c' == _x:
|
|
|
+ break
|
|
|
+ if not _x:
|
|
|
+ break
|
|
|
+ x.append(_x)
|
|
|
+
|
|
|
+
|
|
|
+ if x:
|
|
|
+ x=b"".join(x)
|
|
|
+ if len(x) < 20:
|
|
|
+ print("read::",x)
|
|
|
+ else:
|
|
|
+ print("read::",len(x))
|
|
|
+ self.buffer.append(x)
|
|
|
+ self.read()
|
|
|
+ out = 1
|
|
|
+
|
|
|
+ return out
|
|
|
+
|
|
|
+ def poll(self):
|
|
|
+ while 1:
|
|
|
+ self.read()
|
|
|
+
|
|
|
+ def loop(self):
|
|
|
+ thread.start_new_thread(self.poll,())
|
|
|
+
|
|
|
+
|
|
|
+ def send(self,nachricht):
|
|
|
+ try:
|
|
|
+ #self.xs.send(bytes(nachricht+";","utf-8") )
|
|
|
+ msg = nachricht
|
|
|
+ msg = bytes(msg,encoding="ascii",errors="ignore") #+b";"
|
|
|
+ self.xs.send(msg+b";" )
|
|
|
+ except socket.error as e:
|
|
|
+ self.connect()
|
|
|
+ def close(self):
|
|
|
+ self.xs.close()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def dummyCB(msg):
|
|
|
+ print("dummy_CB",msg)
|
|
|
+
|
|
|
+
|
|
|
+def cmd(cb=dummyCB,port=50000):
|
|
|
+ x=CMD(cb=cb,port=port)
|
|
|
+ while 1:
|
|
|
+ x.poll()
|
|
|
+
|
|
|
+import socket
|
|
|
+import select
|
|
|
+class CMD():
|
|
|
+ def __init__(self,cb=dummyCB,port=50000):
|
|
|
+
|
|
|
+ server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
+ server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
+ #self.xs.getsockopt(socket.AF_INET, socket.SO_REUSEADDR )
|
|
|
+
|
|
|
+ while 1:
|
|
|
+ try:
|
|
|
+ server.bind(("", port))
|
|
|
+ break
|
|
|
+ except Exception as e:
|
|
|
+ print("except",e)
|
|
|
+ print( "bind error")
|
|
|
+ time.sleep(1)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ server.listen(1)
|
|
|
+
|
|
|
+ clients = []
|
|
|
+ clients2 = [""]*300
|
|
|
+ self.server = server
|
|
|
+ self.clients = clients
|
|
|
+ self.clients2 = clients2
|
|
|
+ self.cb=cb
|
|
|
+ self.select=select
|
|
|
+ self.msg=b''
|
|
|
+ def poll(self):
|
|
|
+ server = self.server
|
|
|
+ clients = self.clients
|
|
|
+ clients2 = self.clients2
|
|
|
+ cb=self.cb
|
|
|
+ select=self.select
|
|
|
+ try:
|
|
|
+ #if 1: #
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ lesen, schreiben, oob = select.select([server] + clients,
|
|
|
+ [], [])
|
|
|
+ except:
|
|
|
+ return 0
|
|
|
+ for sock in lesen:
|
|
|
+ if sock is server:
|
|
|
+ client, addr = server.accept()
|
|
|
+ client.setblocking(0)
|
|
|
+ clients.append(client)
|
|
|
+ print("+++ Client %s verbunden" % addr[0])
|
|
|
+ #sock.send("hi du")
|
|
|
+ else:
|
|
|
+ msg=b''
|
|
|
+ try:
|
|
|
+ if self.msg:
|
|
|
+ xmsg = self.msg
|
|
|
+ else:
|
|
|
+ xmsg = sock.recv(1)#1024)#5120)
|
|
|
+ while xmsg:# != b"\x00":
|
|
|
+ if b'\x00' in xmsg:
|
|
|
+ s = xmsg.split(b"\x00",1)
|
|
|
+ msg += s[0]
|
|
|
+ self.msg = s[1]
|
|
|
+ break
|
|
|
+ msg += xmsg
|
|
|
+ xmsg = sock.recv(1)#5120)
|
|
|
+ #xmsg = xmsg.replace(b";",b"")
|
|
|
+ #print(msg)
|
|
|
+ except ConnectionResetError as e:
|
|
|
+ print( "exception",e)
|
|
|
+ pass
|
|
|
+ except BlockingIOError as e:
|
|
|
+ print( "exception",e)
|
|
|
+ pass
|
|
|
+
|
|
|
+ if not msg:
|
|
|
+ continue
|
|
|
+
|
|
|
+
|
|
|
+ print(msg,type(msg))
|
|
|
+ if type(msg) is not bytes:
|
|
|
+ msg = bytes(msg,encoding="ascii",errors="ignore")
|
|
|
+
|
|
|
+ msg = msg.strip()
|
|
|
+ msg = msg.replace(b"EOB",b"")
|
|
|
+
|
|
|
+ if sock in clients:
|
|
|
+ client_nr = clients.index(sock)
|
|
|
+ ip = sock.getpeername()[0]
|
|
|
+
|
|
|
+ if msg:
|
|
|
+ tstamp = time.strftime("%H:%M:%S")
|
|
|
+
|
|
|
+ for xx,msg in enumerate(msg.split(b";")):
|
|
|
+ cmd = msg
|
|
|
+ if cmd:
|
|
|
+ cmd += b'\x0c' #b"\ff"
|
|
|
+ cb({"cmd":cmd},args={"client":client,"addr":addr})
|
|
|
+ else:
|
|
|
+ time.sleep(0.0001)
|
|
|
+ except KeyboardInterrupt:
|
|
|
+ print(" strg+c")
|
|
|
+ finally:
|
|
|
+ for c in clients:
|
|
|
+ print(c,"close")
|
|
|
+ c.close()
|
|
|
+ server.close()
|
|
|
+ print("server close")
|
|
|
+
|
|
|
+
|
|
|
+PORT = 54001
|
|
|
+
|
|
|
+
|
|
|
+def CB(msg,args={}):
|
|
|
+ print()
|
|
|
+ print("CB",msg)
|
|
|
+ #print("CB",msg)
|
|
|
+ #print(dir(msg["client"]))
|
|
|
+ if "client" in args:
|
|
|
+ print("-",args)
|
|
|
+ r = msg["cmd"][:-1]
|
|
|
+ lb = len(v.buffer)
|
|
|
+ if 1:
|
|
|
+ try:
|
|
|
+ a=0
|
|
|
+ b=0
|
|
|
+ if b"-" in r:
|
|
|
+ a,b = r.split(b"-")
|
|
|
+ a = int(a)
|
|
|
+ b = int(b)
|
|
|
+ _ok = 0
|
|
|
+ if lb > a and lb > b:
|
|
|
+ frame = v.buffer[a:b]
|
|
|
+ for f in frame:
|
|
|
+ print("a",len(f))
|
|
|
+ args["client"].send(f)
|
|
|
+ args["client"].send(b"\x0c")
|
|
|
+ time.sleep(0.001)
|
|
|
+ _ok += 1
|
|
|
+ if _ok:
|
|
|
+ print("#",_ok)
|
|
|
+ return
|
|
|
+ except Exception as e:
|
|
|
+ print("3-.",e)
|
|
|
+ try:
|
|
|
+ p = int(r)
|
|
|
+ if lb > p:
|
|
|
+ rr = v.buffer[p]
|
|
|
+ args["client"].send(rr)
|
|
|
+ args["client"].send(b"\x0c")
|
|
|
+ time.sleep(0.001)
|
|
|
+ return
|
|
|
+ except Exception as e:
|
|
|
+ print("4-.",e)
|
|
|
+
|
|
|
+ if len(r) < 20:
|
|
|
+ print("5:- ok",type(r),len(r),r)
|
|
|
+ else:
|
|
|
+ print("6:- ok",type(r),len(r))
|
|
|
+ args["client"].send(r)
|
|
|
+ args["client"].send(b"\x0c")
|
|
|
+
|
|
|
+ print("-")
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ print( sys.argv )
|
|
|
+ if len(sys.argv) >= 2:
|
|
|
+ if sys.argv[1] == "server":
|
|
|
+ cmd(port=PORT,cb=CB)
|
|
|
+ elif sys.argv[1] == "client":
|
|
|
+ c = tcp_sender(port=PORT)
|
|
|
+ while 1:
|
|
|
+ x = input(":: ")
|
|
|
+ c.send(x)
|
|
|
+ time.sleep(0.2)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+exit()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|