python - 使用 Tkinter 的 Python 视频播放器
问题描述
我想创建一个可以使用 python 和 tkinter倒带、快进、停止和播放的视频播放器。我卡在快进和快退部分。我从 youtube 上找到了一些示例,但大部分都在 mp3 上,这对我没有多大帮助。谁能帮我倒带和快进部分?下面是我的代码。
import time
class videoGUI:
def __init__(self, window, window_title):
self.window = window
self.window.title(window_title)
top_frame = Frame(self.window)
top_frame.pack(side=TOP, pady=5)
bottom_frame = Frame(self.window)
bottom_frame.pack(side=BOTTOM, pady=5)
self.rewind = False
self.pause = False # Parameter that controls pause button
self.time=time.time()
self.canvas = Canvas(top_frame)
self.canvas.pack()
self.control_frame=Frame(self.window)
self.control_frame.pack()
#button image and control
self.back_btn_img=PhotoImage(file='F:/Users/Admin/Pictures/back50.png')
self.foward_btn_img=PhotoImage(file='F:/Users/Admin/Pictures/forward50.png')
self.play_btn_img=PhotoImage(file='F:/Users/Admin/Pictures/play50.png')
self.pause_btn_img=PhotoImage(file='F:/Users/Admin/Pictures/pause50.png')
self.stop_btn_img=PhotoImage(file='F:/Users/Admin/Pictures/stop50.png')
# Select Button
self.back_btn=Butto(self.control_frame,image=self.back_btn_img,
borderwidth=0,command=self.back)
self.foward_btn=Button(self.control_frame,image=self.foward_btn_img,
borderwidth=0,command=self.foward)
self.play_btn=Button(self.control_frame,image=self.play_btn_img,
borderwidth=0,command=self.play_video)
self.pause_btn=Butto(self.control_frame,image=self.pause_btn_img,
borderwidth=0,command=self.pause_video)
#button position
self.back_btn.grid(row=5, column=0,padx=10)
self.foward_btn.grid(row=5, column=1,padx=10)
self.play_btn.grid(row=5, column=2,padx=10)
self.pause_btn.grid(row=5, column=3,padx=10)
self.my_menu=Menu(self.window)
self.window.config(menu=self.my_menu)
self.add_video_menu=Menu(self.my_menu)
self.my_menu.add_cascade(label="Add Videos",menu=self.add_video_menu)
self.add_video_menu.add_command(label="Select One Video",command=self.open_file)
self.delay = 15 # ms
self.window.mainloop()
def open_file(self):
self.pause = False
self.filename = filedialog.askopenfilename(title="Select file", filetypes=(("MP4 files", "*.mp4"),
("WMV files", "*.wmv"), ("AVI files", "*.avi")))
print(self.filename)
# Open the video file
self.cap = cv2.VideoCapture(self.filename)
self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
self.canvas.config(width = self.width, height = self.height)
def get_frame(self): # get only one frame
i=0
self.cap.isOpened()
ret, frame = self.cap.read()
return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
def play_video(self):
# Get a frame from the video source, and go to the next frame automatically
ret, frame = self.get_frame()
if ret:
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
self.canvas.create_image(0, 0, image = self.photo, anchor = NW)
if not self.pause:
self.window.after(self.delay, self.play_video)
else:
self.pause=False
def pause_video(self):
self.pause = True
def foward(self):
# foward code havent implement
pass
def back(self):
#backward code havent implement
pass
# Release the video source when the object is destroyed
def __del__(self):
if self.cap.isOpened():
self.cap.release()
videoGUI(Toplevel(), 'Welcome to My Video Player')
'''
解决方案
推荐阅读
- html - 我想引用网站中的特定文本,将其复制并粘贴到 Excel
- mysql - 如何使用 MySQL 连接器或 pyMySql 为 MySql 实现上下文管理器
- swift - 初始化 PDFView 后我无法访问 PDFDocument 属性
- r - 像 rleid 但忽略 NA
- angular - 是否可以在 4 秒的时间延迟后以角度调用 css 类?
- php - 如何使用 foreach 使用 simplexml_load_string 获取数据?
- javascript - CREATEJS:如何检查精灵对象当前是否在屏幕上可见/渲染?
- c# - 如何将列表中的值传递给方法?消息中心?
- php - 如何在 php 中使用 JSON 数据?
- amazon-cloudformation - 在 CloudFormation 中跨不同区域添加 VPC 对等互连