微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tkinter 视频播放器卡住了 opencv

如何解决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 举报,一经查实,本站将立刻删除。