如何解决tkinter 视频播放器卡住了 opencv
我一直在尝试在 tkinter 中构建我自己的简单视频播放器,以便最终为其添加 AI 功能。我一直在尝试与 tkinter 一起实现 cv2 库。 然而,我似乎被困在了基础知识上。我无法在没有任何崩溃的情况下获得适当的暂停和播放按钮(尝试过 cv2.waitKey())。我也花了一些时间试图让交互式进度条工作。至少它显示了位置。任何人都对至少让其中一项工作有建议?或者我在这个项目中使用了低效的库?
from tkinter import*
from PIL import ImageTk,Image
from tkinter import filedialog,ttk
import time
import numpy as np
import cv2
from imutils.video import FPS
from threading import Thread
lsRes={"360p":"(640,360)","540p":"(960,540)","600p":"(1024,600)","640p":"(1138,640)","720p":"(1280,720)","1080p":"(1920,1080)"}
path=r"movie folder"
root = Tk()
root.config(background="#333333")
frame_w=eval(lsRes["600p"])[0]
frame_h=eval(lsRes["600p"])[1]
root.geometry("{}x{}".format(frame_w,frame_h))
root.filename=filedialog.askopenfilename(initialdir=path,title="Select A File",filetypes=((".mp4 files","*.mp4"),(".mkv files","*.mkv"),("all files","*.*")))
root.wm_title("Player - {}".format(root.filename.split("/")[-1]))
#Graphics window
imageFrame = Frame(root)
imageFrame.grid(row=0,column=0,padx=5,pady=5)
#Capture video frames
lmain = Label(imageFrame)
lmain.grid(row=0,columnspan=4)
cap = cv2.VideoCapture(root.filename)
origFPS=cap.get(cv2.CAP_PROP_FPS)
totVidFrames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
vidDuration=totVidFrames/origFPS
fps = FPS().start()
def show_frame(sw=1):
grabbed,frame = cap.read()
if grabbed==False:
cap.release()
else:
frame=cv2.resize(frame,(frame_w-10,frame_h-10-30-25),interpolation = cv2.INTER_AREA)
cv2image = cv2.cvtColor(frame,cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
lmain.imgtk = imgtk
lmain.configure(image=imgtk)
lmain.after(2,show_frame)
fps.update()
fps.stop()
status=Label(imageFrame,text="FPS {:.1f}/{:.1f}".format(fps.fps(),origFPS),bd=1,relief=SUNKEN).grid(row=2,column=3)
def updateSlider():
global slider
while cap.isOpened():
frameIndex=int(cap.get(cv2.CAP_PROP_POS_FRAMES))
time.sleep(0.5)
slider.set(frameIndex)
t=Thread(target=updateSlider,daemon=True).start()
slider=Scale(imageFrame,from_=0,to=totVidFrames,orient=HORIZONTAL,showvalue=0,length=frame_w-10)
slider.grid(row=1,columnspan=4)
button_pause=Button(imageFrame,text="Pause",command=lambda:show_frame(0)).grid(row=2,column=1)
button_play=Button(imageFrame,text="Play",command="").grid(row=2,column=0)
show_frame()
root.mainloop() #Starts GUI
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。