video_import.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. import time
  2. import os
  3. import _thread as thread
  4. import cv2
  5. import sys
  6. from optparse import OptionParser
  7. parser = OptionParser()
  8. parser.add_option("", "--videoplayer", dest="videoplayer",#default=1,
  9. help="enable videoplayer") #, metavar="FILE")
  10. (options, args) = parser.parse_args()
  11. PLAYLIST = []
  12. play_list = "/home/user/LibreLight/video/" #.format(path)
  13. def open_playlist():
  14. print()
  15. print("======== OPEN PLAYLIST DIR !!",play_list)
  16. if not os.path.isdir(play_list):
  17. os.system("mkdir -p {}".format(play_list))
  18. _lines = os.listdir(play_list)
  19. _lines.sort()
  20. lines = ['']*25 # first is empty
  21. i=0
  22. for l in _lines:
  23. #print(">> ",l.strip(),len(lines))
  24. l = l.strip()
  25. if "_" in l:
  26. ll = l.split("_",1)
  27. print(">> ",ll)
  28. #ll = int(ll)
  29. try:
  30. lll = int(ll[0])
  31. #lines.append(l.strip())
  32. lines[lll] = l
  33. except:pass
  34. if len(lines) <= 10:
  35. for i in range(10-len(lines)):
  36. lines.append("")#"LINE ERROR")
  37. return lines
  38. PLAYLIST_TIME = time.time()
  39. PLAYLIST = open_playlist()
  40. def rescale_frame2(frame, width):
  41. height = int(frame.shape[0]/frame.shape[1] * width )
  42. dim = (width, height)
  43. return cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
  44. def rescale_frame(frame, percent=75):
  45. width = int(frame.shape[1] * percent/ 100)
  46. height = int(frame.shape[0] * percent/ 100)
  47. dim = (width, height)
  48. return cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
  49. class Vopen2():
  50. def __init__(self,dmx=None,_id=None):
  51. self.buffer = []
  52. self._run = 0
  53. self.fps = 1
  54. self.scale = 1
  55. self.fpath = "/home/user/LibreLight/video/"
  56. self.fname = "xx.mp4"
  57. self.cv2 = cv2
  58. self.dim = 0
  59. self.dmx = 0
  60. self.Rsuccess = 1
  61. self.Rcap = None
  62. self._video_nr=-1
  63. self._init()
  64. def next(self):
  65. pass
  66. def buf_size(self):
  67. sizeof = 0
  68. for i in self.buffer:
  69. sizeof += sys.getsizeof(i)
  70. #sizeof = sys.getsizeof(self.buffer)
  71. sizeof = sizeof/8/1024
  72. sizeof = sizeof/100 # gets real mb
  73. sizeof = int(sizeof)
  74. return sizeof
  75. def __repr__(self):
  76. sizeof = self.buf_size()
  77. return "< id:{}.. buf:{} run:{} fps:{} scale:{} name:{} sof:{}>".format(
  78. int(id(self)/10000000),len(self.buffer),self._run,self.fps,self.scale
  79. ,self.fname,sizeof
  80. )
  81. def select_video(self,dmx_value):
  82. print()
  83. print(self,"select_video()",dmx_value)
  84. try:
  85. dmx_value = int(dmx_value/10)
  86. if self._video_nr != dmx_value:
  87. self._video_nr = dmx_value
  88. if self._video_nr < len(PLAYLIST):
  89. self.fname = str(PLAYLIST[self._video_nr])
  90. print("- fname:",self.fname)
  91. self._init()
  92. except Exception as e:
  93. print("Vopen.select_video()",dmx_value,e)
  94. def _init(self):
  95. print(self)
  96. print("videoplayer.init()",self.fpath,self.fname)
  97. if not os.path.isfile(self.fpath+self.fname):
  98. print("-- video file does not exits !! >",self.fpath,self.fname)
  99. print()
  100. self.Rsuccess = 0
  101. if self.cv2:
  102. self.Rcap = self.cv2.VideoCapture(self.fpath+self.fname, cv2.CAP_FFMPEG)
  103. self.Rcap.read()
  104. self.Rsuccess = 1
  105. self._read()
  106. def _read(self):
  107. success = self.Rsuccess
  108. ok = 0
  109. if success and self.fname:
  110. cap = self.Rcap
  111. _break = 0
  112. try:
  113. success, img = cap.read()
  114. if not success:
  115. self.Rcap.release()
  116. self.Rcap.retrieve()
  117. self.end = 1
  118. return
  119. if self.fps == 0:
  120. self.fps = cap.get(cv2.CAP_PROP_FPS)
  121. img = self.cv2.cvtColor(img, self.cv2.COLOR_BGR2RGB)
  122. img = rescale_frame2(img, 200) # 1MB -> 45MB, saves MEMORY / RAM
  123. #img = rescale_frame2(img, 400) # 1MB -> 215MB
  124. # store frame into buffer list
  125. self.buffer.append(img)
  126. ok = 1
  127. if len(self.buffer) % 100 == 0:
  128. _id = str(self.__repr__)[-5:-1]
  129. print(_id,"video read",self.dmx,len(self.buffer),self.fname,"fps",self.fps,self.dim)
  130. except Exception as e:
  131. print("Excetpion","_init",self,e,end="")
  132. self.success = 1
  133. return ok
  134. import sys
  135. sys.path.insert(0,"../lib/")
  136. if len(sys.argv) > 1 and sys.argv[1] == "client":
  137. pass
  138. else:
  139. sstart = time.time()
  140. #v=Vopen()
  141. v=Vopen2()
  142. #input("start ?")
  143. v.select_video(20)
  144. #v.select_video(30)
  145. b1 = -1
  146. b2 = 0
  147. #for i in range(100):
  148. i=0
  149. print()
  150. while 1:
  151. v._read()
  152. #print(i,v)
  153. if b1 == len(v.buffer):
  154. break
  155. else:
  156. b1 = len(v.buffer)
  157. i+=1
  158. print(i,v)
  159. v.next()
  160. stime = time.time() - sstart
  161. l = len(v.buffer)
  162. print("frames",l,"fps:",int(l/stime))
  163. print(len(v.buffer),v)
  164. #input("end")
  165. # ----------------------
  166. import socket
  167. import sys
  168. import time
  169. class tcp_sender(object):
  170. def __init__(self,port=50000):
  171. self.port = port
  172. self.buffer = []
  173. self.connect()
  174. self.loop()
  175. def connect(self,client_name="unkown"):
  176. self.xip = "127.0.0.1" #raw_input("IP-Adresse: ")
  177. self.xs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  178. try:
  179. self.xs.connect((self.xip, self.port)) #50000))
  180. except ConnectionRefusedError as e:
  181. print("ConnectionRefusedError: ", "ERR: {0} ".format(e.args) ,end="")
  182. print("Server nicht ereichbar/unterbrochen")
  183. time.sleep(1)
  184. self.connect()
  185. print("connected !")
  186. def read(self):
  187. #client.setblocking(0)
  188. x=[]
  189. out = 0
  190. while 1:
  191. _x = self.xs.recv(1)
  192. if b'\x0c' == _x:
  193. break
  194. if not _x:
  195. break
  196. x.append(_x)
  197. if x:
  198. x=b"".join(x)
  199. if len(x) < 20:
  200. print("read::",x)
  201. else:
  202. print("read::",len(x))
  203. self.buffer.append(x)
  204. self.read()
  205. out = 1
  206. return out
  207. def poll(self):
  208. while 1:
  209. self.read()
  210. def loop(self):
  211. thread.start_new_thread(self.poll,())
  212. def send(self,nachricht):
  213. try:
  214. #self.xs.send(bytes(nachricht+";","utf-8") )
  215. msg = nachricht
  216. msg = bytes(msg,encoding="ascii",errors="ignore") #+b";"
  217. self.xs.send(msg+b";" )
  218. except socket.error as e:
  219. self.connect()
  220. def close(self):
  221. self.xs.close()
  222. def dummyCB(msg):
  223. print("dummy_CB",msg)
  224. def cmd(cb=dummyCB,port=50000):
  225. x=CMD(cb=cb,port=port)
  226. while 1:
  227. x.poll()
  228. import socket
  229. import select
  230. class CMD():
  231. def __init__(self,cb=dummyCB,port=50000):
  232. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  233. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  234. #self.xs.getsockopt(socket.AF_INET, socket.SO_REUSEADDR )
  235. while 1:
  236. try:
  237. server.bind(("", port))
  238. break
  239. except Exception as e:
  240. print("except",e)
  241. print( "bind error")
  242. time.sleep(1)
  243. server.listen(1)
  244. clients = []
  245. clients2 = [""]*300
  246. self.server = server
  247. self.clients = clients
  248. self.clients2 = clients2
  249. self.cb=cb
  250. self.select=select
  251. self.msg=b''
  252. def poll(self):
  253. server = self.server
  254. clients = self.clients
  255. clients2 = self.clients2
  256. cb=self.cb
  257. select=self.select
  258. try:
  259. #if 1: #
  260. while True:
  261. try:
  262. lesen, schreiben, oob = select.select([server] + clients,
  263. [], [])
  264. except:
  265. return 0
  266. for sock in lesen:
  267. if sock is server:
  268. client, addr = server.accept()
  269. client.setblocking(0)
  270. clients.append(client)
  271. print("+++ Client %s verbunden" % addr[0])
  272. #sock.send("hi du")
  273. else:
  274. msg=b''
  275. try:
  276. if self.msg:
  277. xmsg = self.msg
  278. else:
  279. xmsg = sock.recv(1)#1024)#5120)
  280. while xmsg:# != b"\x00":
  281. if b'\x00' in xmsg:
  282. s = xmsg.split(b"\x00",1)
  283. msg += s[0]
  284. self.msg = s[1]
  285. break
  286. msg += xmsg
  287. xmsg = sock.recv(1)#5120)
  288. #xmsg = xmsg.replace(b";",b"")
  289. #print(msg)
  290. except ConnectionResetError as e:
  291. print( "exception",e)
  292. pass
  293. except BlockingIOError as e:
  294. print( "exception",e)
  295. pass
  296. if not msg:
  297. continue
  298. print(msg,type(msg))
  299. if type(msg) is not bytes:
  300. msg = bytes(msg,encoding="ascii",errors="ignore")
  301. msg = msg.strip()
  302. msg = msg.replace(b"EOB",b"")
  303. if sock in clients:
  304. client_nr = clients.index(sock)
  305. ip = sock.getpeername()[0]
  306. if msg:
  307. tstamp = time.strftime("%H:%M:%S")
  308. for xx,msg in enumerate(msg.split(b";")):
  309. cmd = msg
  310. if cmd:
  311. cmd += b'\x0c' #b"\ff"
  312. cb({"cmd":cmd},args={"client":client,"addr":addr})
  313. else:
  314. time.sleep(0.0001)
  315. except KeyboardInterrupt:
  316. print(" strg+c")
  317. finally:
  318. for c in clients:
  319. print(c,"close")
  320. c.close()
  321. server.close()
  322. print("server close")
  323. PORT = 54001
  324. def CB(msg,args={}):
  325. print()
  326. print("CB",msg)
  327. #print("CB",msg)
  328. #print(dir(msg["client"]))
  329. if "client" in args:
  330. print("-",args)
  331. r = msg["cmd"][:-1]
  332. lb = len(v.buffer)
  333. if 1:
  334. try:
  335. a=0
  336. b=0
  337. if b"-" in r:
  338. a,b = r.split(b"-")
  339. a = int(a)
  340. b = int(b)
  341. _ok = 0
  342. if lb > a and lb > b:
  343. frame = v.buffer[a:b]
  344. for f in frame:
  345. print("a",len(f))
  346. args["client"].send(f)
  347. args["client"].send(b"\x0c")
  348. time.sleep(0.001)
  349. _ok += 1
  350. if _ok:
  351. print("#",_ok)
  352. return
  353. except Exception as e:
  354. print("3-.",e)
  355. try:
  356. p = int(r)
  357. if lb > p:
  358. rr = v.buffer[p]
  359. args["client"].send(rr)
  360. args["client"].send(b"\x0c")
  361. time.sleep(0.001)
  362. return
  363. except Exception as e:
  364. print("4-.",e)
  365. if len(r) < 20:
  366. print("5:- ok",type(r),len(r),r)
  367. else:
  368. print("6:- ok",type(r),len(r))
  369. args["client"].send(r)
  370. args["client"].send(b"\x0c")
  371. print("-")
  372. if __name__ == "__main__":
  373. print( sys.argv )
  374. if len(sys.argv) >= 2:
  375. if sys.argv[1] == "server":
  376. cmd(port=PORT,cb=CB)
  377. elif sys.argv[1] == "client":
  378. c = tcp_sender(port=PORT)
  379. while 1:
  380. x = input(":: ")
  381. c.send(x)
  382. time.sleep(0.2)
  383. exit()