2026. június 15., hétfő

MP4 videó lejátszó Python nyelven (Szoftverfejlesztő)

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