video_player.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/usr/bin/env python3
  2. import cv2
  3. import pygame
  4. import pygame.font
  5. import time
  6. import os
  7. pygame.init()
  8. class Vopen():
  9. def __init__(self):
  10. self.fname = '/home/user/Downloads/video.mp4'
  11. self.fname = '/home/user/Downloads/video.ogv'
  12. self.fname = '/home/user/Downloads/bbb_sunflower_480x320.mp4'
  13. self.x = 0
  14. self.y = 0
  15. self.im = None
  16. self.pos = 0
  17. self.buffer = []
  18. self.init()
  19. def init(self):
  20. print(self,"init()",self.fname)
  21. if not os.path.isfile(self.fname):
  22. print()
  23. print("video file does not exits !! >",self.fname)
  24. print()
  25. exit()
  26. self.buffer = []
  27. cap = cv2.VideoCapture(self.fname)
  28. self.cap = cap
  29. self.success, self.img = self.cap.read()
  30. try:
  31. self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)
  32. #self.buffer.append(self.img)
  33. self.pos = 0
  34. except:pass
  35. self.shape = self.img.shape[1::-1]
  36. def read(self):
  37. #print(self,"read()")
  38. self.success, self.img = self.cap.read()
  39. #print(self.success)
  40. try:
  41. self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)
  42. except Exception as e:
  43. print("exception 432",e)
  44. def prev(self):
  45. self.pos -= 1
  46. if self.pos < 0:
  47. self.pos = len(self.buffer)-1
  48. self.im = self.buffer[self.pos]
  49. def next(self):
  50. #print(self,"play",time.time())
  51. #print(dir(self.cap))
  52. #print(self.cap.set.__doc__)
  53. #print(self.cap.grab.__doc__)
  54. self.read()
  55. try:
  56. self.im = pygame.image.frombuffer(self.img.tobytes(), self.shape, "RGB")
  57. self.buffer.append(self.im)
  58. self.pos += 1
  59. # wn.blit(im, (self.x, self.y))
  60. except AttributeError as e:
  61. print("except",e)
  62. time.sleep(1)
  63. self.init()
  64. def draw(self,wn=None):
  65. if self.success and wn: # is not None:
  66. wn.blit(self.im, (self.x, self.y))
  67. v = Vopen()
  68. shape = [300,300]
  69. if v.shape:
  70. shape = v.shape
  71. wn = pygame.display.set_mode(v.shape,pygame.RESIZABLE)
  72. window = wn
  73. clock = pygame.time.Clock()
  74. pygame.display.set_caption('LibreLight VIDEO PLAYER (BOUNCE-LOOP)')
  75. def grab(x=55,y=55,w=60,h=60):
  76. # usage
  77. # sub = grab()
  78. # window.blit(sub, (500,10))
  79. rect = pygame.Rect(x, y, w, h)
  80. sub = window.subsurface(rect)
  81. #pixArray = pygame.PixelArray(screen)
  82. crop = pygame.Surface((w,h))
  83. crop.blit(sub, (0,0))
  84. return crop
  85. max_frame=0
  86. success=1
  87. loop = 1
  88. run = 1
  89. while v.success and success:
  90. for event in pygame.event.get():
  91. if event.type == pygame.QUIT:
  92. success = False
  93. _button = None
  94. if "button" in event.dict:
  95. _button = event.dict["button"]
  96. if event.type:
  97. print(_button, event.type,run)
  98. if _button == 1:
  99. if event.type == 5:
  100. print("----")
  101. if run:
  102. run = 0
  103. else:
  104. run = 1
  105. d = "PAUSE"
  106. if run:
  107. if loop:
  108. d = "PLAY"
  109. if max_frame < 100:
  110. v.next()
  111. max_frame+=1
  112. else:
  113. d = "REVERSE"
  114. #max_frame = 0
  115. #v.init()
  116. v.prev()
  117. if v.pos <= 0:
  118. max_frame = 0
  119. v.pos = len(v.buffer)-1
  120. else:
  121. v.next()
  122. #print(i)
  123. if wn:
  124. v.draw(wn) #,x=0,y=0)
  125. # overlay
  126. font15 = pygame.font.SysFont("freemonobold",20)
  127. fr = font15.render(">:{}".format(d) ,1, (0,0,0))
  128. wn.blit(fr,(10,10))
  129. font15 = pygame.font.SysFont("freemonobold",20)
  130. fr = font15.render("FRAME:{}".format(v.pos) ,1, (0,0,0))
  131. wn.blit(fr,(110,10))
  132. sub = grab()
  133. wn.blit(sub, (500,10))
  134. pygame.display.update()
  135. clock.tick(420)
  136. #clock.tick(60)
  137. pygame.quit()