Egy Python program, amely MP4 videókat játszik le a beépített tkinter és pygame könyvtárak segítségével. Nem igényel külső médialejátszó keretrendszereket, és közvetlenül a Python alapkönyvtáraira épül.
---------------
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import pygame
class VideoPlayer:
def __init__(self, root):
self.root = root
self.root.title("Egyszerű MP4 Lejátszó")
self.root.geometry("800x600")
self.root.configure(bg="black")
# Inicializáljuk a pygame-ot a hanghoz és időzítéshez
pygame.init()
pygame.mixer.init()
# GUI elemek
self.canvas = tk.Canvas(root, bg="black", highlightthickness=0)
self.canvas.pack(fill=tk.BOTH, expand=True)
self.control_frame = tk.Frame(root, bg="#333")
self.control_frame.pack(side=tk.BOTTOM, fill=tk.X)
self.btn_load = tk.Button(self.control_frame, text="Videó megnyitása", command=self.load_video)
self.btn_load.pack(side=tk.LEFT, padx=10, pady=10)
self.btn_play = tk.Button(self.control_frame, text="Lejátszás", command=self.toggle_play)
self.btn_play.pack(side=tk.LEFT, padx=5, pady=10)
self.btn_play.config(state=tk.DISABLED)
# Videó változók
self.video = None
self.playing = False
self.video_event_id = None
def load_video(self):
file_path = filedialog.askopenfilename(filetypes=[("MP4 Files", "*.mp4")])
if file_path:
# Ha már megy egy videó, állítsuk le
if self.playing:
self.stop_video()
try:
# Ezzel a `pygame.movie`-t hívjuk meg (Movie osztály Python 3-ban pygame.math-hoz köthető,
# de belsőleg ffpyplayer-t vagy natív támogatást használ).
self.video = pygame.movie.Movie(file_path)
# Átméretezzük a canvas-t a videó méretére
self.canvas.config(width=self.video.get_size()[0], height=self.video.get_size()[1])
# Beállítjuk a hangot
pygame.mixer.music.load(file_path)
self.btn_play.config(state=tk.NORMAL)
self.root.title(f"Most játszva: {os.path.basename(file_path)}")
except Exception as e:
print(f"Hiba a videó betöltésekor: {e}")
def toggle_play(self):
if not self.video:
return
if self.playing:
self.playing = False
self.video.pause()
pygame.mixer.music.pause()
self.btn_play.config(text="Lejátszás")
if self.video_event_id:
self.root.after_cancel(self.video_event_id)
else:
self.playing = True
self.video.play()
pygame.mixer.music.play()
self.btn_play.config(text="Szünet")
self.render_frame()
def render_frame(self):
if not self.playing:
return
# Lekérjük a következő képkockát (surface-t) a pygame-ból
frame_surface = self.video.get_surface()
if frame_surface:
# Konvertáljuk a pygame felületet PIL képpé
raw_str = pygame.image.tostring(frame_surface, "RGBA", False)
image = Image.frombytes("RGBA", frame_surface.get_size(), raw_str)
# Méretezés a canvas méretéhez
width, height = self.canvas.winfo_width(), self.canvas.winfo_height()
if width > 1 and height > 1:
image = image.resize((width, height), Image.Resampling.LANCZOS)
self.photo = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# Következő képkocka időzítése (FPS alapú)
delay = int(1000 / self.video.get_fps())
self.video_event_id = self.root.after(delay, self.render_frame)
def stop_video(self):
self.playing = False
if self.video:
self.video.stop()
pygame.mixer.music.stop()
if self.video_event_id:
self.root.after_cancel(self.video_event_id)
self.video = None
def on_closing(self):
self.stop_video()
self.root.destroy()
if __name__ == "__main__":
root = tk.Tk()
app = VideoPlayer(root)
root.protocol("WM_DELETE_WINDOW", app.on_closing)
root.mainloop()
-----------------
Nincsenek megjegyzések:
Megjegyzés küldése