Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save me-suzy/6c361df54daa54d94f2050911bb853bd to your computer and use it in GitHub Desktop.
Save me-suzy/6c361df54daa54d94f2050911bb853bd to your computer and use it in GitHub Desktop.
Combina si compreseaza toate video-urile si imaginile intr-un singur video - final
import os
import sys # <-- importăm sys pentru a putea opri scriptul cu sys.exit()
from moviepy.editor import VideoFileClip, ImageClip, AudioFileClip, concatenate_videoclips, concatenate_audioclips
import re
def get_video_info(clip):
return {
'durată': f"{clip.duration:.2f} secunde",
'dimensiune': f"{os.path.getsize(clip.filename)/(1024*1024):.1f} MB",
'rezoluție': f"{clip.size[0]}x{clip.size[1]}",
'fps': f"{clip.fps}"
}
def process_video_compression(video_clip, output_file, target_bitrate, original_size):
try:
video_clip.write_videofile(
output_file,
codec='libx264',
audio_codec='aac',
temp_audiofile='temp-audio.m4a',
remove_temp=True,
bitrate=f"{target_bitrate/1000:.0f}k",
preset="veryslow",
threads=4,
audio_bitrate="128k",
ffmpeg_params=[
"-crf", "28",
"-movflags", "+faststart",
"-profile:v", "high",
"-level", "4.1",
"-pix_fmt", "yuv420p",
"-tune", "film",
"-maxrate", f"{target_bitrate*1.5/1000:.0f}k",
"-bufsize", f"{target_bitrate*2/1000:.0f}k"
]
)
final_size = os.path.getsize(output_file)
compression_ratio = (1 - final_size/original_size) * 100
print("\n=== Rezultate Compresie ===")
print(f"Dimensiune originală: {original_size/(1024*1024):.1f} MB")
print(f"Dimensiune după compresie: {final_size/(1024*1024):.1f} MB")
print(f"Rata de compresie: {compression_ratio:.1f}%")
return True
except Exception as e:
print(f"\n❌ Eroare la compresie: {str(e)}")
return False
finally:
if os.path.exists('temp-audio.m4a'):
os.remove('temp-audio.m4a')
def combine_and_compress_media(input_directory, output_file, audio_files=None, image_duration=5):
try:
media_files = [
f for f in os.listdir(input_directory)
if f.lower().endswith(('.mp4', '.jpg', '.png'))
]
if not media_files:
print("❌ Nu s-au găsit fișiere media în director!")
return False
media_files.sort(key=lambda s: [
int(t) if t.isdigit() else t.lower()
for t in re.split('([0-9]+)', s)
])
print("\nFișiere găsite:", ", ".join(media_files))
clips = []
total_size = 0
for file in media_files:
print(f"\nProcesez: {file}")
full_path = os.path.join(input_directory, file)
try:
if file.lower().endswith('.mp4'):
clip = VideoFileClip(full_path).resize(width=1024)
else:
img = ImageClip(full_path)
clip = img.resize(width=1024).set_duration(image_duration)
clips.append(clip)
total_size += os.path.getsize(full_path)
except Exception as e:
# Afișăm un mesaj clar și oprim scriptul când întâlnim un fișier corupt
print(f"\n❌ Eroare la procesarea fișierului `{file}`: {str(e)}")
print("Oprire prelucrare!")
sys.exit(1) # oprește complet execuția
if not clips:
print("Nu s-au putut procesa fișierele media!")
return False
print("\nCombin clipurile...")
final_clip = concatenate_videoclips(clips, method="compose")
if audio_files:
try:
audio_clips = []
current_duration = 0
while current_duration < final_clip.duration:
for audio_file in audio_files:
if current_duration >= final_clip.duration:
break
audio = AudioFileClip(audio_file)
remaining = final_clip.duration - current_duration
if audio.duration > remaining:
audio = audio.subclip(0, remaining)
audio_clips.append(audio)
current_duration += audio.duration
if audio_clips:
final_audio = concatenate_audioclips(audio_clips)
final_clip = final_clip.set_audio(final_audio)
except Exception as e:
print(f"Eroare la procesarea audio: {str(e)}")
return process_video_compression(final_clip, output_file, 2000*1000, total_size)
except Exception as e:
print(f"❌ Eroare: {str(e)}")
return False
def main():
INPUT_PATH = r"g:\Video Munte 26 decembrie 2024\2" # folder cu imagini/video
AUDIO_FILES = [
r"g:\Muzica\Wham! - Last Christmas (Official 4K Video).mp3",
r"g:\Muzica\Jean Michel Jarre - Oxygene IV.mp3" # a doua melodie care va porni după ce se termină prima
]
output_file = os.path.join(INPUT_PATH, "final_media_cu_audio.mp4")
success = combine_and_compress_media(INPUT_PATH, output_file, AUDIO_FILES, image_duration=5)
if success:
print("\n✅ Procesul s-a finalizat cu succes!")
else:
print("\n❌ Procesul a eșuat!")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment