Created
February 13, 2026 09:46
-
-
Save me-suzy/83ca57339a5085fae499b7a468c1a50c to your computer and use it in GitHub Desktop.
merge videos.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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