Created
December 27, 2024 18:15
-
-
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
This file contains 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 | |
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