Midnight Grocery un
import moviepy.editor as mp
import numpy as np
from moviepy.video.fx.all import fadein, fadeout
# === Konfigurasi ===
audio_path = "Midnight Grocery Run.mp3"
img1_path = "apple_1.jpg"
img2_path = "apple_2.jpg"
logo_path = "logo.png" # opsional
output_path = "output_brontowali.mp4"
fps_value = 24
use_logo = False # True = logo, False = teks watermark
resolution = "1080p" # pilih: "720p", "1080p", "4k", "720p_vertical", "1080p_vertical"
# === Resolusi map ===
res_map = {
"720p": (1280, 720),
"1080p": (1920, 1080),
"4k": (3840, 2160),
"720p_vertical": (720, 1280),
"1080p_vertical": (1080, 1920)
}
W, H = res_map.get(resolution, (1920,1080))
# === Audio ===
audio = mp.AudioFileClip(audio_path).audio_fadein(2).audio_fadeout(2)
duration = audio.duration
# === Gambar utama (berganti) ===
img1 = mp.ImageClip(img1_path).set_duration(duration/2).resize(height=H-200).set_position("center")
img2 = mp.ImageClip(img2_path).set_duration(duration/2).resize(height=H-200).set_position("center")
visual = mp.concatenate_videoclips([fadeout(img1, 2), fadein(img2, 2)], method="compose")
# === Spectrum sederhana ===
def spectrum_frame(t):
n_bars, h = 60, 200
frame = np.zeros((h, W, 3), dtype=np.uint8)
try:
samples = audio.to_soundarray(fps=audio.fps)[int(t*audio.fps):int(t*audio.fps)+1024, 0]
vol = np.abs(samples).mean()
except: vol = 0.1
for i in range(n_bars):
bh = min(int(vol*1000*np.random.uniform(0.5,1.5)), h)
frame[h-bh:h, i*(W//n_bars):(i+1)*(W//n_bars)] = (0,255,200)
return frame
spectrum = mp.VideoClip(spectrum_frame, duration=duration).set_position(("center","bottom"))
# === Judul & Credit ===
title = fadein(mp.TextClip("Midnight Grocery Run", fontsize=int(W/18), color="white").set_duration(duration).set_position(("center", 40)),2).fx(fadeout,2)
credit = fadein(mp.TextClip("Made with MoviePy • Brontowali Channel", fontsize=int(W/28), color="white").set_duration(5).set_start(duration-5).set_position(("center","bottom")),1).fx(fadeout,1)
# === Watermark (logo/teks) ===
if use_logo:
watermark = mp.ImageClip(logo_path).set_duration(duration).resize(width=int(W/8)).set_position(("right","bottom"))
else:
shadow = mp.TextClip("Brontowali Channel", fontsize=int(W/28), color="black").set_duration(duration).set_opacity(0.7).set_position((W-250, H-45))
main = mp.TextClip("Brontowali Channel", fontsize=int(W/28), color="white").set_duration(duration).set_opacity(0.7).set_position(("right","bottom"))
watermark = mp.CompositeVideoClip([shadow, main], size=(W,H))
# === Gabung semua ===
final = mp.CompositeVideoClip([visual, spectrum, title, credit, watermark], size=(W,H)).set_audio(audio)
final.write_videofile(output_path, codec="libx264", audio_codec="aac", fps=fps_value)
关闭于 2025-09-22 0 条评论