Skip to content

Instantly share code, notes, and snippets.

@me-suzy
Created February 13, 2026 09:46
Show Gist options
  • Select an option

  • Save me-suzy/83ca57339a5085fae499b7a468c1a50c to your computer and use it in GitHub Desktop.

Select an option

Save me-suzy/83ca57339a5085fae499b7a468c1a50c to your computer and use it in GitHub Desktop.
merge videos.py
import os
from pathlib import Path
from moviepy.editor import VideoFileClip, ImageClip, concatenate_videoclips, AudioFileClip, CompositeAudioClip
def create_video():
# Configurare
input_folder = Path(".")
output_video = "output_final.mp4"
audio_path = "" # Lasă gol pentru sunet original sau pune calea către .mp3
target_fps = 30
target_resolution = (1920, 1080)
# Colectare fișiere
video_files = sorted([f for f in input_folder.glob("*.mp4") if f.name != output_video])
image_files = sorted(input_folder.glob("*.jpg")) + sorted(input_folder.glob("*.png"))
clips = []
# Procesare videoclipuri
print(f"[*] Pornire procesare cu Audio {'Loop' if audio_path else 'Original'}...")
for idx, video_file in enumerate(video_files, 1):
print(f" [{idx}/{len(video_files)}] Procesez: {video_file.name}")
clip = VideoFileClip(str(video_file))
# Păstrează sunetul original
original_audio = clip.audio
# Redimensionare cu păstrare aspect ratio
clip_resized = clip.resize(height=target_resolution[1])
if clip_resized.w > target_resolution[0]:
clip_resized = clip_resized.resize(width=target_resolution[0])
# Reașază audio original
clip_resized.audio = original_audio
clips.append(clip_resized)
# Procesare imagini
for image_file in image_files:
img_clip = ImageClip(str(image_file), duration=5)
img_resized = img_clip.resize(height=target_resolution[1])
if img_resized.w > target_resolution[0]:
img_resized = img_resized.resize(width=target_resolution[0])
clips.append(img_resized)
# Combinare clipuri
print("[*] Combinare clipuri...")
final_clip = concatenate_videoclips(clips, method="compose")
final_clip = final_clip.set_fps(target_fps)
# Procesare Audio
if audio_path and os.path.exists(audio_path):
print("[*] Procesare Audio (Loop activat)...")
audio = AudioFileClip(audio_path)
# Loop audio dacă este mai scurt decât video
if audio.duration < final_clip.duration:
num_loops = int(final_clip.duration / audio.duration) + 1
audio = concatenate_videoclips([audio] * num_loops, method="compose")
audio = audio.set_duration(final_clip.duration)
else:
audio = audio.subclip(0, final_clip.duration)
# Combină audio original cu melodia de fundal
if final_clip.audio:
combined_audio = CompositeAudioClip([final_clip.audio, audio.volumex(0.3)])
final_clip = final_clip.set_audio(combined_audio)
else:
final_clip = final_clip.set_audio(audio)
else:
print("[*] Păstrare sunet original din videoclipuri...")
# Sunetul original este deja atașat la clipuri
# Export
print("[*] Export video final...")
final_clip.write_videofile(
output_video,
codec="libx264",
audio_codec="aac",
fps=target_fps,
preset="medium",
threads=4
)
print(f"[✓] Gata! Video salvat: {output_video}")
if __name__ == "__main__":
create_video()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment