Можно ли встроить видеопроигрыватель (например, VLC Player) в Tkinter или кнопки управления воспроизведением в Tkinter? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть программа Tkinter.Мне нужен встроенный видеопроигрыватель в Tkinter, или же у меня есть возможность управления воспроизведением видео непосредственно в Tkinter.Моя цель - сохранить позиции наведения мыши на объекте интереса в данном видео.

import Tkinter as tk
from Tkinter import *
import PIL.Image,PIL.ImageTk 
import time
import cv2


class App:
    def __init__(self, window, window_title, video_source=0):
        self.window = window
        self.window.title(window_title)
        self.video_source = video_source
        self.video_loaded=False

    # open video source (by default this will try to open the computer webcam)
        self.vid = MyVideoCapture(self.video_source)

    # Create a canvas that can fit the above video source size
        self.canvas = tk.Canvas(window, width = self.vid.width, height = 
        self.vid.height)
        self.canvas.pack()

        self.canvas.bind('<Motion>',self.motion)
        self.canvas.bind('<Button-1>',self.follow_motion)
       #self.canvas.bind("<Enter>", self.on_enter)
       #self.canvas.bind("<Leave>", self.on_leave)

       # Button that lets the user take a snapshot
        self.btn_snapshot=tk.Button(window, text="Snapshot", width=50,  
        command=self.snapshot)
        self.btn_snapshot.pack(anchor=tk.CENTER, expand=True)

        self.btn_collapse=tk.Button(window, text="Collapse", width=50, 
        command=self.collapse)
        self.btn_collapse.pack(anchor=tk.CENTER, expand=True)

        self.btn_load_video=tk.Button(window, text="Load Video", width=50, 
        command=self.load_video)
        self.btn_load_video.pack(anchor=tk.CENTER, expand=True)

     #if self.video_loaded==True:
     # After it is called once, the update method will be automatically 
     called every delay milliseconds
     self.delay = 15
     self.update()


     self.window.mainloop()

     def load_video(self):
    # open video source (by default this will try to open the computer 
     webcam)
        self.vid = MyVideoCapture(self.video_source)
        self.video_loaded=True

     def snapshot(self):
     # Get a frame from the video source
        ret, frame = self.vid.get_frame()

     if ret:
        cv2.imwrite("frame-" + time.strftime("%d-%m-%Y-%H-%M-%S") +  ".jpg", 
        cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))

     def collapse(self):
         self.window.quit()  

     def follow_motion(self,event):
         global follow
         follow = not follow

     def motion(self,event):
         self.x=event.x
         self.y=event.y
         print('{},{}'.format(self.x, self.y))
         #self.canvas.itemconfigure(text='({x},{y})'.format(x = self.x, 
         #y=self.y))


     #def motion(self):
     #    x, y = self.x, self.y
     #   print('{}, {}'.format(x, y))  

     #def on_enter(self, event):
     #    self.l2.configure(text="Hello world")

     #def on_leave(self, enter):
     #    self.l2.configure(text="")       

     def update(self):
     # Get a frame from the video source
         ret, frame = self.vid.get_frame()

     if ret:
        self.photo = PIL.ImageTk.PhotoImage(image = 
        PIL.Image.fromarray(frame))
        self.canvas.create_image(0, 0, image = self.photo, anchor = tk.NW)

     self.window.after(self.delay, self.update)

class MyVideoCapture:
    def __init__(self, video_source=0):
    # Open the video source
        video_source='./videofilename.wmv'
        self.vid = cv2.VideoCapture(video_source)
        if not self.vid.isOpened():
           raise ValueError("Unable to open video source", video_source)

    # Get video source width and height
       self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
       self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)

    def get_frame(self):
        if self.vid.isOpened():
           ret, frame = self.vid.read()
           if ret:
            # Return a boolean success flag and the current frame converted 
            to BGR
              return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
           else:
              return (ret, None)
        else:
           return (ret, None)

    # Release the video source when the object is destroyed
    def __del__(self):
       if self.vid.isOpened():
          self.vid.release()

# Create a window and pass it to the Application object
root = tk.Tk()   
follow = False        
App(root, "Tkinter and OpenCV")   

Вот [ссылка] [https://solarianprogrammer.com/2018/04/21/python-opencv-show-video-tkinter-window/], из которой я получил основной код.

Я попробовал решения, упомянутые в этой ссылке , а также здесь , но все равно не помогло с проблемой.

Когда я это сделаю: import vlc Я все еще получаю следующую ошибку:

  Traceback (most recent call last):

  File "<ipython-input-6-7c36fff9a8c5>", line 1, in <module>
  import vlc

  File "vlc.py", line 203, in <module>
   dll, plugin_path  = find_lib()

  File "vlc.py", line 173, in find_lib
  dll = ctypes.CDLL(libname)

  File "C:\Anaconda2\envs\py27\lib\ctypes\__init__.py", line 362, in __init__
   self._handle = _dlopen(self._name, mode)

  WindowsError: [Error 126] The specified module could not be found`

Ценю любую помощь.Заранее спасибо.

...