Browse Source

fix: videoplayer reset pause 0.5

micha 1 year ago
parent
commit
8ebfdf92eb
1 changed files with 53 additions and 367 deletions
  1. 53 367
      vpu/vpu_live.py

+ 53 - 367
vpu/vpu_live.py

@@ -50,6 +50,10 @@ parser.add_option("", "--videoplayer", dest="videoplayer",#default=1,
 
 (options, args) = parser.parse_args()
 
+
+import numpy
+
+
 for o in dir(options):
     if "_" in o:
         continue
@@ -132,328 +136,6 @@ try:
     PLAYLIST = open_playlist()
 except:pass
 
-class Vopen_NEW():
-
-    def __init__(self,dmx=None,_id=None):
-        global PLAYLIST
-
-        self._id = _id
-        self.fpath = '/home/user/Downloads/'
-        self.fpath = '/home/user/LibreLight/video/'
-        self.fname = '' #'bbb_sunflower_480x320.mp4'
-        #self.fname = 'no-video.mp4'
-        try:
-            self.fname = PLAYLIST[0]
-        except Exception as e:
-            print("Exception set video from PLAYLIST 5543:",e)
-
-
-        self.fps = 0
-        self.scale = 50 #%
-        self.dmx=dmx
-        self.dim = 0
-        self.x = 0
-        self.y = 0
-        self.init_count = 0
-        self.cap = None
-        self.shape = [200,200]  
-        self.img = None
-        self.success = 1
-        self.cv2 = None
-        self._run = 0
-        self.end = 0
-        self._video_nr = 0
-
-        self.ready  = 0
-
-        self.shape_x = 370
-        self.shape_y = 235
-        try:
-            global cv2
-            self.cv2 = cv2
-        except:
-            pass
-
-        self.init()
-
-    def init(self):
-        print("---- ---- Vopen.init()",[self.fname,self._video_nr])
-        print(PLAYLIST)
-        self.time = 0
-        self.t_delta = 0 
-        self.t_last  = time.time()
-        self.im = None
-        self.pos = 0
-        self.buffer = []
-        self._init()
-        self.init_count = 1
-
-    def select_video(self,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])
-                    self.init()
-
-        except Exception as e:
-            print("Vopen.select_video()",dmx_value,e)
-
-
-    def close_cap():
-        pass
-
-    def _init(self):
-        self.cap = self.cv2.VideoCapture(self.fpath+self.fname, cv2.CAP_FFMPEG) 
-        self.Rcap = self.cap
-        self.success, self.img = self.cap.read()
-
-    def _del(self):
-        pass
-
-
-    def _read(self):
-        ok = 0
-        if self.success:
-            self.success, self.img = self.cap.read()
-
-            if self.fps == 0:
-                self.fps = self.cap.get(cv2.CAP_PROP_FPS)
-            
-            self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
-            self.img = self.rescale_frame2(self.img, 200)
-            #self.shape = self.img.shape[1::-1]
-            self.buffer.append(self.img)
-
-            #self.buffer.append(self.img)
-
-            s = sys.getsizeof(self.buffer)/1024
-            #print(s)
-            ok = 1
-            self.ready = 1
-        #if len(self.buffer) >= 30:
-        #    self.ready = 1
-        return ok
-    def read(self):
-        if len(self.buffer) <= 0:
-            return
-        try:
-            if self.pos >= len(self.buffer):
-                self.pos = len(self.buffer)-1 
-            self._img = self.buffer[int(self.pos)]
-            self.img = self._img
-            #self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
-            self.img = self.rescale_frame(self.img, percent=self.scale)
-            self.shape = self.img.shape[1::-1]
-
-            if self._run: # and len(self.buffer) > 400:
-                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 = 0 #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:
-            print("exception 432",e,len(self.buffer),self.fname)
-            #self.init()
-
-    def prev(self):
-        pass
-
-    def rescale_frame2(self,frame, width):
-        height = int(frame.shape[0]/frame.shape[1] * width )
-        dim = (width, height)
-        return self.cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
-
-    def rescale_frame(self,frame, percent=75):
-        width  = int(frame.shape[1] * percent/ 100)
-        height = int(frame.shape[0] * percent/ 100)
-        dim = (width, height)
-        return self.cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
-
-    def next(self):
-         
-        self.read()
-        try:
-            if len(self.buffer) % 100 == 0:
-                _id = str(self.__repr__)[-5:-1]
-
-            # add DIMER to videplayer
-            self.cv2.normalize(self.img, self.img, 0, self.dim, self.cv2.NORM_MINMAX) 
-            
-            img = self.img 
-            if img is None:
-                return 
-            shape = img.shape[1::-1]
-            im = pygame.image.frombuffer(img.tobytes(), shape, "RGB")
-            self.im = im
-
-            if self._run and len(self.buffer) > 30:
-                t = time.time()
-                self.t_delta = t-self.t_last 
-                self.t_last = t
-                self.pos += self.t_delta*self.fps
-                #self.pos += 4 # speedupt for testing
-            else:
-                t = time.time()
-                self.t_delta = 0 
-                self.t_last = t
-
-            if self.pos >= len(self.buffer):
-                self.pos = 0 # restart
-                #self.pos = len(self.buffer)-1 # stay at the end
-
-        except AttributeError as e:
-            time.sleep(.05)
-            #if self.init_count % 100 == 0:
-            print("except 776",str(self).split(" ")[-1],e)
-            #self.init()
-        except Exception as e:
-            print("except 756",str(self).split(" ")[-1], e)
-
-    def draw(self,wn=None):
-        
-        if self.dim <= 1:
-            return
-
-        if self.scale < 255*.05:
-            self.scale = 255*0.05
-
-        # draw video background box
-        __xw = int(self.shape_x*self.scale/255)
-        __yw = int(self.shape_y*self.scale/255)
-    
-        #xx ,yy = (370,235)
-        xx = self.shape_x #= xx
-        yy = self.shape_y #= yy
-        try:
-            xx ,yy = self.im.get_size()[:2]
-            self.shape_x = xx
-            self.shape_y = yy
-        except AttributeError as e:
-            pass
-
-        xx = int(xx*self.scale/255)
-        yy = int(yy*self.scale/255)
-
-
-        __xw = int(xx) #*self.scale/255)
-        __yw = int(yy) #*self.scale/255)
-        yellow = [105,50,0]
-        yellow[0] = int(yellow[0]*self.dim/255)  
-        yellow[1] = int(yellow[1]*self.dim/255)  
-        yellow[2] = int(yellow[2]*self.dim/255)  
-        #print(yellow)
-        if 1: #corner left up
-            p1 = [self.x+2,self.y+2]  
-            p2 = [self.x+__xw-4,self.y+__yw-4]
-            p3 = [self.x+__xw-4,self.y+2]
-            p4 = [self.x+2,self.y+__yw-4]
-
-            p1 = [self.x,self.y]  
-            p2 = [self.x+__xw,self.y+__yw]
-            p3 = [self.x+__xw,self.y]
-            p4 = [self.x,self.y+__yw]
-            
-            hx=int(xx/2)
-            hy=int(yy/2)
-            #print(hx,hy,xx,yy) #,ratio)
-            #print("-")
-            #print(sys.getsizeof(self.buffer))
-            #print(sys.getsizeof(self))
-            #print(sys.getsizeof(self.Rcap))
-            #print(dir(self.Rcap))
-            p1 = [self.x-hx,self.y-hy]  
-            p2 = [self.x+__xw-hx,self.y+__yw-hy]
-            p3 = [self.x+__xw-hx,self.y-hy]
-            p4 = [self.x-hx,self.y+__yw-hy]
-
-            pygame.draw.rect(wn,yellow    ,[p1[0]  ,p1[1]  ,__xw  ,__yw])
-            pygame.draw.rect(wn,[25,20,20],[p1[0]+1,p1[1]+1,__xw-2,__yw-2])
-            pygame.draw.line(wn,yellow    ,p1      ,p2)
-            pygame.draw.line(wn,yellow    ,p3      ,p4)
-        if 0: #corner left up
-            pygame.draw.rect(wn,yellow,[self.x,self.y,__xw,__yw])
-            pygame.draw.rect(wn,[25,20,20],[self.x+1,self.y+1,__xw-2,__yw-2])
-            pygame.draw.line(wn,yellow,[self.x+2,self.y+2],[self.x+__xw-4,self.y+__yw-4])
-            pygame.draw.line(wn,yellow,[self.x+__xw-4,self.y+2],[self.x+2,self.y+__yw-4])
-        if 0: #corner right down
-            pygame.draw.rect(wn,yellow,[self.x-__xw,self.y-__yw,__xw,__yw])
-            pygame.draw.rect(wn,[25,20,20],[self.x+1-__xw,self.y+1-__yw,__xw-2,__yw-2])
-            pygame.draw.line(wn,yellow,[self.x+2-__xw,self.y+2-__yw],[self.x+__xw-4-__xw,self.y+__yw-4-__yw])
-            pygame.draw.line(wn,yellow,[self.x+__xw-4-__xw,self.y+2-__yw],[self.x+2-__xw,self.y+__yw-4-__yw])
-
-        #pygame.draw.line(wn,yellow,[self.x,self.y],[self.x,self.y+300])
-        #pygame.draw.line(wn,yellow,[self.x,self.y],[self.x+300,self.y])
-        pz = 0
-        #txt = "FPS:{} F:{:05} von {:05} sec:{:0.02f} von {:0.02f}"
-        #txt = txt.format(self.fps,int(self.pos),len(self.buffer),(-1),pz ) 
-        #if self.end:
-        #    fr = font15.render(txt,1, (0,255,0))
-        #else:
-        #    fr = font15.render(txt,1, (255,0,0))
-        #wn.blit(fr,(10,main_size[1]-(self._id+1)*35))
-
-        if self.ready and wn and self.im: # is not None:
-            #wn.blit(self.im, (int(self.x), int(self.y)))
-            #wn.blit(self.im, (int(self.x-__xw), int(self.y-__yw)))
-            #xx ,yy = self._img.shape[:2]
-            xx ,yy = self.im.get_size()[:2]
-            #print(xx,yy)
-            #wn.blit(self.im, (int(self.x+xx/2), int(self.y+yy/2)))
-            wn.blit(self.im, (int(self.x-xx/2), int(self.y-yy/2)))
-
-    def overlay(self,wn=None,mode="x"):
-        # overlay 
-        y = main_size[1]-(self._id+1)*50
-        pygame.draw.rect(wn,[255,200,0],[5,y,300,28+15])
-        font15 = pygame.font.SysFont("freemonobold",17)
-
-        pz = 0
-
-        if self.end:
-            rgb = [ 100,255,100]
-        else:
-            rgb = [255,100,0]
-        pygame.draw.rect(wn,rgb,[220,y,80,13])
-
-        _line = "error no _line"
-        _line ="F:{:05} von {:05} sec:{:0.02f} von {:0.02f}"
-        if self.fps == 0: # check if div zerro
-            fps = 1
-            _line = _line.format(int(self.pos),len(self.buffer),(-1),pz )
-        else:
-            pz = (len(self.buffer)/self.fps)
-            _line = _line.format(self.fps,int(self.pos),len(self.buffer),(self.pos/self.fps),pz )  
-
-        fr = font15.render(_line ,1, (0,0,0))
-        wn.blit(fr,(10,y))
-
-        if self._run:
-            mode = "run"
-        else:
-            mode = "pause"
-        txt = "fps:{} id:{} nr:{} scale:{} "
-        txt = txt.format(self.fps,self._id+1,self._video_nr,int(self.scale) ) 
-        fr = font15.render(txt,1, (0,0,0))
-        wn.blit(fr,(3,y+15))
-
-        txt = "{}: {}"
-        txt = txt.format(mode,self.fname ) 
-        fr = font15.render(txt,1, (0,0,0))
-        wn.blit(fr,(3,y+30))
-
 
 class Vopen():
 
@@ -470,7 +152,7 @@ class Vopen():
         except Exception as e:
             print("Exception set video from PLAYLIST 5543:",e)
 
-
+        self.restart_t = time.time()
         self.fps = 0
         self.scale = 50 #%
         self.dmx=dmx
@@ -498,6 +180,11 @@ class Vopen():
 
         self.init()
 
+    def restart(self):
+        print(self,"reset()")
+        self.pos = 0 
+        self.restart_t = time.time()
+
     def init(self):
         print("---- ---- Vopen.init()",[self.fname,self._video_nr])
         print(PLAYLIST)
@@ -604,6 +291,7 @@ class Vopen():
                 
                 #self.cv2.normalize(self.img, self.img, 0, self.dim, self.cv2.NORM_MINMAX) 
                 
+                # store frame into buffer list
                 self.buffer.append(self.img)
                 ok = 1
                 if len(self.buffer) % 100 == 0:
@@ -616,34 +304,7 @@ class Vopen():
         return ok
 
     def read(self):
-        if len(self.buffer) <= 0:
-            return
-        try:
-            if self.pos >= len(self.buffer):
-                self.pos = len(self.buffer)-1 
-            self._img = self.buffer[int(self.pos)]
-            self.img = self._img
-            #self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
-            self.img = self.rescale_frame(self.img, percent=self.scale)
-
-            if self._run: # and len(self.buffer) > 400:
-                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 = 0 #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:
-            print("exception 432",e,len(self.buffer),self.fname)
-            #self.init()
+        pass
 
     def prev(self):
         self.pos -= 1
@@ -664,12 +325,49 @@ class Vopen():
         dim = (width, height)
         return self.cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)
 
+    def pause(self):
+        #print("pause",self.t_last)
+        t = time.time()
+        self.t_delta = 0 
+        self.t_last = t
+
+    def next_frame(self):
+        #return 0
+        
+        if self._run and len(self.buffer) > 30:
+            t = time.time()
+            self.t_delta = t-self.t_last 
+            self.pos += self.t_delta*self.fps
+            self.t_last = t
+        else:
+            self.pause()
+
+        if self.restart_t > time.time()-0.5:
+            # prevent flickerung by reset
+            #self.pause()
+            self.pos = 5
+            pass
+
+        # restart at the end
+        if self.pos >= len(self.buffer):
+            self.pos = 0 
+
+        self._img = self.buffer[int(self.pos)]
+        self.img = self._img
+
     def next(self):
          
-        self.read()
         try:
+            self.next_frame()
+
+            #self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
+            self.img = self.rescale_frame(self.img, percent=self.scale)
+
+            self.shape = self.img.shape[1::-1]
+
             if len(self.buffer) % 100 == 0:
                 _id = str(self.__repr__)[-5:-1]
+                print("next",_id)
 
             # add DIMER to videplayer
             self.cv2.normalize(self.img, self.img, 0, self.dim, self.cv2.NORM_MINMAX) 
@@ -679,20 +377,7 @@ class Vopen():
                 return 
             self.im = pygame.image.frombuffer(img.tobytes(), self.shape, "RGB")
 
-            if self._run and len(self.buffer) > 30:
-                t = time.time()
-                self.t_delta = t-self.t_last 
-                self.t_last = t
-                self.pos += self.t_delta*self.fps
-                #self.pos += 4 # speedupt for testing
-            else:
-                t = time.time()
-                self.t_delta = 0 
-                self.t_last = t
-
-            if self.pos >= len(self.buffer):
-                self.pos = 0 # restart
-                #self.pos = len(self.buffer)-1 # stay at the end
+            #self.next_frame()
 
         except AttributeError as e:
             time.sleep(.05)
@@ -828,6 +513,7 @@ class Vopen():
         fr = font15.render("{}".format(self.fname) ,1, (0,0,0))
         wn.blit(fr,(60,main_size[1]-(self._id+1)*35+15))
 
+Vopen = Vopen
 
 VIDEO = []
 videoplayer=[]            
@@ -1954,7 +1640,7 @@ def draw_video(VIDEO):
         if k in count:
             if count[k]:
                 count[k] = 0
-                video1.pos = 0 
+                video1.restart()
 
         k = "_RUN"
         if k in count: