видеоплеер + opencv
взял код tkVideoPlayer и сделал под opencv. Но почему-то с каждым последующим кадром видео прогружается все дольше. В чем причина и как поправить?
import os
import datetime
import tkinter as tk
import numpy as np
import cv2
from PIL import Image, ImageTk
def update_duration():
""" updates the duration after finding the duration """
duration = int(tots)-1
end_time["text"] = str(datetime.timedelta(seconds=duration))
progress_slider["to"] = duration
def update_scale():
""" updates the scale value """
progress_value.set(i)
start_time.config(text=str(datetime.timedelta(seconds=i)))
def plays():
global i
if i == tots - 1:
i=0
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
_, frame = cap.read()
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
display.imgtk = imgtk
display.configure(image=imgtk)
update_duration()
update_scale()
if play_pause_btn["text"] == "Play":
i += 1
elif play_pause_btn["text"] == "Pause":
i = i
window1.after(0, plays)
def seek(value):
""" used to seek a specific timeframe """
global i
i = int(value)
progress_value.set(i)
seek(int(value))
def skip(value: int):
""" skip seconds """
global i
if value == -5:
i -= 5
elif value == 5:
i += 5
progress_value.set(progress_slider.get() + value)
seek(int(progress_slider.get()) + value)
def play_pause():
global i
""" pauses and plays """
if play_pause_btn["text"] == "Play":
play_pause_btn["text"] = "Pause"
elif play_pause_btn["text"] == "Pause":
play_pause_btn["text"] = "Play"
window1 = tk.Tk()
display = tk.Label(window1)
display.pack(expand=True, fill="both")
play_pause_btn = tk.Button(window1, text="Play", command=play_pause)
play_pause_btn.pack()
skip_plus_5sec = tk.Button(window1, text="Skip -5 sec", command=lambda: skip(-5))
skip_plus_5sec.pack(side="left")
start_time = tk.Label(window1, text=str(datetime.timedelta(seconds=0)))
start_time.pack(side="left")
progress_value = tk.IntVar(window1)
progress_slider = tk.Scale(window1, variable=progress_value, from_=0, to=0, orient="horizontal", command=seek)
progress_slider.pack(side="left", fill="x", expand=True)
end_time = tk.Label(window1, text=str(datetime.timedelta(seconds=0)))
end_time.pack(side="left")
skip_plus_5sec = tk.Button(window1, text="Skip +5 sec", command=lambda: skip(5))
skip_plus_5sec.pack(side="left")
video_name = 'test.mp4'
cap = cv2.VideoCapture(video_name)
tots = cap.get(cv2.CAP_PROP_FRAME_COUNT)
i = 0
window1.geometry('800x600')
fps = cap.get(cv2.CAP_PROP_FPS)
progress_slider.config(to=0, from_=0)
play_pause_btn["text"] = "Play"
progress_value.set(0)
plays()
window1.mainloop()
Я так понимаю проблема где-то здесь:
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
display.imgtk = imgtk
display.configure(image=imgtk)
или нет? Что-то хранит обработанные данные из-за чего с каждым кадром нагрузка на процессор растет.
Или может кто подскажет видеоплеер свыводом изображения из opencv библиотеки? Вся проблема в том, что проект основной построен на opencv, а у него конфликт сновыми версиями библиотеки av (которая работает с видео). А так же нужна библиотека кроссплатфоменная, и для windows и для linux