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()



Posting Komentar