Prechádzať zdrojové kódy

add: dmx_loop() -> thread, calculate videoplayer fps/time_delta

micha 2 rokov pred
rodič
commit
9bf5195463
1 zmenil súbory, kde vykonal 81 pridanie a 24 odobranie
  1. 81 24
      vpu/vpu_live.py

+ 81 - 24
vpu/vpu_live.py

@@ -143,6 +143,11 @@ class Vopen():
         except Exception as e:
             print("Exception set video from PLAYLIST 5543",e)
 
+        self.time = 0
+        self.t_delta = 0 
+        self.t_last  = time.time()
+
+        self.fps = 0
         self.scale = 50 #%
         self.dmx=dmx
         self.x = 0
@@ -159,7 +164,6 @@ class Vopen():
             self.cv2 = cv2
         except:
             pass
-
         self.im = None
         self.pos = 0
         self.buffer = []
@@ -187,19 +191,23 @@ class Vopen():
             while success:
                 try:
                     success, self.img = self.cap.read()
+                    if self.fps == 0:
+                        self.fps = self.cap.get(cv2.CAP_PROP_FPS)
+                        #print("fps",self.fps)
+                    
                     #self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
                     self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
                     self.img = self.rescale_frame2(self.img, 100)
                     self.buffer.append(self.img)
                     if len(self.buffer) % 100 == 0:
                         _id = str(self.__repr__)[-5:-1]
-                        print(_id,"video read",self.dmx,len(self.buffer),self.fname)
+                        print(_id,"video read",self.dmx,len(self.buffer),self.fname,"fps",self.fps)
                         time.sleep(0.2)
                     time.sleep(0.005)
                 except Exception as e:
                     print("Excetpion","_init",self,e)
             self.pos = 0
-            self.img = self.buffer[self.pos]
+            self.img = self.buffer[int(self.pos)]
             self.success = 1
 
     def read(self):
@@ -208,15 +216,22 @@ class Vopen():
             return
         try:
             if self.pos >= len(self.buffer):
-                self.pos = len(self.buffer)-1
-            self.img = self.buffer[self.pos]
+                self.pos = 0 #len(self.buffer)-1
+            self.img = self.buffer[int(self.pos)]
             #self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
             self.img = self.rescale_frame(self.img, percent=self.scale)
             if self._run:
-                self.pos += 4
+                t = time.time()
+                self.t_delta = t-self.t_last 
+                self.t_last = t
+                self.pos += self.t_delta*self.fps
+            else:
+                t = time.time()
+                self.t_delta = 0 
+                self.t_last = t
 
             if self.pos >= len(self.buffer):
-                self.pos = len(self.buffer)-1
+                self.pos = 0 #len(self.buffer)-1
             #print("video.read",self.pos)
             self.shape = self.img.shape[1::-1]
         except Exception as e:
@@ -229,7 +244,7 @@ class Vopen():
             self.pos = len(self.buffer)-1
         if self.pos >= len(self.buffer):
             self.pos = len(self.buffer)-1
-        self.im = self.buffer[self.pos]
+        self.im = self.buffer[int(self.pos)]
 
     def rescale_frame2(self,frame, width):
         height = int(frame.shape[0]/frame.shape[1] * width )
@@ -261,8 +276,18 @@ class Vopen():
             #print(type(self.im))
             #self.buffer.append(self.im)
 
+            #self.pos = int(self.time * self.fps)
             if self._run:
-                self.pos += 4
+                t = time.time()
+                self.t_delta = t-self.t_last 
+                self.t_last = t
+                self.pos += self.t_delta*self.fps
+            else:
+                t = time.time()
+                self.t_delta = 0 
+                self.t_last = t
+            #if self._run:
+            #    self.pos += 2
 
             if self.pos > len(self.buffer):
                 self.pos = 0
@@ -1275,6 +1300,8 @@ def draw_video(VIDEO):
         cb=255
         csize=10
         cdim=0
+        
+
         k = "DIM"
         if k in count:
             cdim = int(count[k])
@@ -1295,9 +1322,18 @@ def draw_video(VIDEO):
             ctilt = int(ctilt)
 
         video1 = videoplayer[i]
+        k = "_reset"
+        if k in count:
+            if count[k]:
+                count[k] = 0
+                video1.pos = 0 
+
         k = "_RUN"
         if k in count:
             video1._run = count[k]
+
+
+
         video1.pos 
         video1.x=40+cpan
         video1.y=60+pm_wy+ctilt
@@ -1373,7 +1409,7 @@ def video_dmx(VIDEO,dataA):
             count["CONTROL"] = dataA[cDMX+3]
 
             if count["CONTROL"] >= 10 and count["CONTROL"] < 20:
-                count["_time"] = int(time.time()*10)/10
+                count["_reset"] = 1
 
             if count["CONTROL"] >= 20 and count["CONTROL"] < 30:
                 if count["_RUN"] == 1:
@@ -1521,6 +1557,39 @@ def draw_gobo(GRID,data):
             j += 1
         i += 1
 
+ips=[]
+dataA=[]
+data=[]
+
+def dmx_raw():
+    global ips,dataA,data
+    ips = read_index()
+    
+    # ----
+    ip = select_ip(ips,univ=1) # univ 1 gobo
+    dataA = read_dmx(ip)
+    # ----
+
+    data = read_dmx_data(ip,ips)
+
+
+    if options.countdown:
+        counter_dmx(COUNTER,dataA)
+    
+    if VIDEO:
+        video_dmx(VIDEO,dataA)
+    return ips,dataA,data
+
+
+def dmx_loop():
+    while 1:
+        dmx_raw()
+        time.sleep(0.1)
+
+dmx_raw()
+
+thread.start_new_thread(dmx_loop,())
+
 t1 = Timer(143)
 time.sleep(0.33)
 t2 = Timer(11)
@@ -1536,11 +1605,13 @@ def main():
     global TEXT_BLOCK_TIME
     global PLAYLIST
     global PLAYLIST_TIME
+    global dataA
 
     GRID =  init_grid(_x=_x,_y=_y) #init_gird()
     #GRID =  init_grid(_x=8,_y=8) #init_gird()
     print("GRID LEN:",len(GRID))
 
+    #thread.start_new_thread( video_dmx_loop,(VIDEO,dataA) )
 
     s=time.time()
     print("run")
@@ -1564,21 +1635,7 @@ def main():
         calc_fps()
         draw_overlay()
 
-        ips = read_index()
-        
-        # ----
-        ip = select_ip(ips,univ=1) # univ 1 gobo
-        dataA = read_dmx(ip)
-        # ----
-
-        data = read_dmx_data(ip,ips)
-
 
-        if options.countdown:
-            counter_dmx(COUNTER,dataA)
-        
-        if VIDEO:
-            video_dmx(VIDEO,dataA)