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 (将#修改为@)