Bookmark

Aplikasi Pengubah Coventer PNG Ke MP4

Aplikasi sederhana Python untuk mengubah gambar PNG → video MP4 dengan 2 mode otomatis: Landscape dan Portrait. Cocok untuk workflow konten seperti yang Anda lakukan (thumbnail, background live, shorts, dll). 🚀

Aplikasi ini:

  • ambil semua PNG dalam folder

  • otomatis buat video 10 detik

  • output MP4

  • mode Landscape (1280x720)

  • mode Portrait (1080x1920)

🧰 Aplikasi PNG → Video MP4

File: png_to_video.py


  
import os
import subprocess
import glob

# ============================
# CONFIG
# ============================

INPUT_FOLDER = "input_png"
OUTPUT_FOLDER = "output_video"

DURATION = 10  # durasi video per gambar (detik)

# resolusi
LANDSCAPE = "1280:720"
PORTRAIT = "1080:1920"

# ============================
# SETUP FOLDER
# ============================

os.makedirs(OUTPUT_FOLDER, exist_ok=True)

png_files = glob.glob(os.path.join(INPUT_FOLDER, "*.png"))

if not png_files:
    print("❌ Tidak ada file PNG")
    exit()

# ============================
# PROCESS
# ============================

for png in png_files:

    name = os.path.splitext(os.path.basename(png))[0]

    # LANDSCAPE
    out_land = os.path.join(OUTPUT_FOLDER, f"{name}_landscape.mp4")

    cmd_land = [
        "ffmpeg",
        "-loop", "1",
        "-i", png,
        "-t", str(DURATION),
        "-vf", f"scale={LANDSCAPE}",
        "-c:v", "libx264",
        "-pix_fmt", "yuv420p",
        "-y",
        out_land
    ]

    subprocess.run(cmd_land)

    # PORTRAIT
    out_port = os.path.join(OUTPUT_FOLDER, f"{name}_portrait.mp4")

    cmd_port = [
        "ffmpeg",
        "-loop", "1",
        "-i", png,
        "-t", str(DURATION),
        "-vf", f"scale={PORTRAIT}",
        "-c:v", "libx264",
        "-pix_fmt", "yuv420p",
        "-y",
        out_port
    ]

    subprocess.run(cmd_port)

    print(f"✅ Selesai: {name}")

print("🚀 Semua video selesai dibuat!")


 

📂 Struktur Folder

png-video-app

├── png_to_video.py

├── input_png
│ ├── gambar1.png
│ ├── gambar2.png

└── output_video

▶ Cara Menjalankan

Install dulu FFmpeg

Download
https://ffmpeg.org/download.html

lalu jalankan:

python png_to_video.py

🎬 Hasil Output

Misal input:

quran.png
jazz.png

output:

quran_landscape.mp4
quran_portrait.mp4
jazz_landscape.mp4
jazz_portrait.mp4

mode Portrait (1080x1920)

🧰 Aplikasi PNG → Video MP4, versi 2

File: png_to_video.py


import os
import subprocess
import glob
from tkinter import Tk, Label, Button, filedialog, StringVar, OptionMenu, Entry, Checkbutton, IntVar

# ==============================================
# PNG VIDEO GENERATOR SULTAN (PRO MAX)
# Convert PNG → Video (Landscape / Portrait)
# Optional: cinematic zoom + ready for live loop
# Requires: FFmpeg installed in system PATH
# ==============================================

class SultanGenerator:

    def __init__(self, root):
        self.root = root
        root.title("PNG VIDEO GENERATOR SULTAN 🚀")
        root.geometry("480x420")

        self.input_folder = ""
        self.output_folder = ""

        # mode
        self.mode = StringVar()
        self.mode.set("Landscape 1280x720")

        # duration
        self.duration = StringVar()
        self.duration.set("10")

        # options
        self.zoom = IntVar()

        Label(root, text="PNG → VIDEO GENERATOR SULTAN", font=("Arial",14)).pack(pady=10)

        Button(root,text="Select PNG Folder",command=self.select_input).pack(pady=5)
        Button(root,text="Select Output Folder",command=self.select_output).pack(pady=5)

        Label(root,text="Video Mode").pack(pady=(10,0))

        OptionMenu(root,self.mode,
                   "Landscape 1280x720",
                   "Portrait 1080x1920").pack()

        Label(root,text="Duration per Image (seconds)").pack(pady=(10,0))
        Entry(root,textvariable=self.duration,width=10).pack()

        Checkbutton(root,text="Cinematic Zoom Effect",variable=self.zoom).pack(pady=10)

        Button(root,text="GENERATE VIDEOS",command=self.generate).pack(pady=15)

        Button(root,text="MERGE ALL FOR LIVE",command=self.merge_live).pack(pady=5)

        self.status = Label(root,text="Status: Ready")
        self.status.pack(pady=20)

    # ---------------------------

    def select_input(self):
        self.input_folder = filedialog.askdirectory()
        self.status.config(text=f"Input: {self.input_folder}")

    def select_output(self):
        self.output_folder = filedialog.askdirectory()
        self.status.config(text=f"Output: {self.output_folder}")

    def resolution(self):
        if "Landscape" in self.mode.get():
            return "1280:720"
        else:
            return "1080:1920"

    # ---------------------------

    def generate(self):

        if not self.input_folder or not self.output_folder:
            self.status.config(text="Select folders first")
            return

        res = self.resolution()
        duration = self.duration.get()

        png_files = glob.glob(os.path.join(self.input_folder,"*.png"))

        if not png_files:
            self.status.config(text="No PNG files found")
            return

        for png in png_files:

            name = os.path.splitext(os.path.basename(png))[0]
            output = os.path.join(self.output_folder,f"{name}.mp4")

            if self.zoom.get():
                vf = f"scale={res},zoompan=z='min(zoom+0.0015,1.5)':d=125"
            else:
                vf = f"scale={res}"

            cmd = [
                "ffmpeg",
                "-loop","1",
                "-i",png,
                "-t",duration,
                "-vf",vf,
                "-c:v","libx264",
                "-pix_fmt","yuv420p",
                "-y",
                output
            ]

            subprocess.run(cmd,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)

        self.status.config(text="Videos Generated 🚀")

    # ---------------------------

    def merge_live(self):

        videos = glob.glob(os.path.join(self.output_folder,"*.mp4"))

        if not videos:
            self.status.config(text="No videos to merge")
            return

        list_file = os.path.join(self.output_folder,"playlist.txt")

        with open(list_file,"w") as f:
            for v in videos:
                f.write(f"file '{v}'\n")

        output_live = os.path.join(self.output_folder,"LIVE_READY.mp4")

        cmd = [
            "ffmpeg",
            "-f","concat",
            "-safe","0",
            "-i",list_file,
            "-c","copy",
            "-y",
            output_live
        ]

        subprocess.run(cmd)

        self.status.config(text="LIVE video ready 🎬")

# ==============================================

if __name__ == "__main__":

    root = Tk()

    app = SultanGenerator(root)

    root.mainloop()



 

📂 Str

Posting Komentar

Posting Komentar