Created
September 12, 2024 12:25
-
-
Save koorukuroo/e0a59fd7116d62aa24a3a6460227dadd to your computer and use it in GitHub Desktop.
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
from moviepy.editor import TextClip, CompositeVideoClip, ColorClip | |
from moviepy.editor import VideoFileClip, concatenate_videoclips | |
from moviepy.video.fx.all import fadein, fadeout | |
from multiprocessing import Pool | |
import os | |
# 시간을 HH:MM:SS 형식으로 변환하는 함수 | |
def format_time(seconds): | |
hours = seconds // 3600 | |
minutes = (seconds % 3600) // 60 | |
seconds = seconds % 60 | |
return f"{hours:02}:{minutes:02}:{seconds:02}" | |
# 개별 클립을 생성하는 함수 | |
def create_single_clip(i): | |
# 배경 클립 (색상 애니메이션 포함) | |
bg_color = (255, 192, 203) if i % 2 == 0 else (173, 216, 230) # 파스텔 색상 변화 | |
bg_clip = ColorClip((1920, 1080), color=bg_color).set_duration(1) | |
# 시간 텍스트 클립 생성 | |
time_text = format_time(i) | |
txt_clip = TextClip(time_text, fontsize=150, font="Comic-Sans-MS", color='white', | |
size=(1920, 1080)).set_duration(1) | |
# 텍스트를 중앙에 배치하고 페이드 인/아웃 추가 | |
txt_clip = txt_clip.set_position('center') | |
txt_clip = fadein(txt_clip, 0.5).fx(fadeout, 0.5) | |
# 텍스트와 배경 합성 | |
clip = CompositeVideoClip([bg_clip, txt_clip]) | |
# 클립을 파일로 저장 (압축 설정을 통해 파일 크기 및 메모리 사용 최소화) | |
filename = f"countdown_part_{i}.mp4" | |
clip.write_videofile(filename, fps=24, codec="libx264", preset="ultrafast", bitrate="500k") | |
# 메모리 해제 | |
del clip, bg_clip, txt_clip | |
return filename | |
# 병렬로 클립 생성 (CPU 및 메모리 제한 설정) | |
def create_cute_preppy_countdown_video(duration=3600): | |
# CPU 제한: 50개로 제한 | |
with Pool(5) as pool: | |
filenames = pool.map(create_single_clip, range(duration, 0, -1)) | |
return filenames | |
# 비디오 파일 병합 | |
from moviepy.editor import VideoFileClip, concatenate_videoclips | |
# 비디오 파일 병합 (배치 처리) | |
def merge_videos(filenames, batch_size=50): | |
final_clips = [] | |
# 배치로 비디오 병합 | |
for i in range(0, len(filenames), batch_size): | |
batch_filenames = filenames[i:i+batch_size] | |
# 각 배치 파일을 로드하고 병합 | |
clips = [VideoFileClip(filename) for filename in batch_filenames] | |
final_batch = concatenate_videoclips(clips, method="compose") | |
# 임시 파일에 저장 후 메모리 해제 | |
batch_filename = f"temp_batch_{i}.mp4" | |
final_batch.write_videofile(batch_filename, fps=24) | |
final_clips.append(batch_filename) | |
# 메모리 해제 | |
for clip in clips: | |
clip.close() | |
del clips, final_batch | |
# 모든 배치 파일을 다시 병합 | |
final_clips_videos = [VideoFileClip(filename) for filename in final_clips] | |
final_video = concatenate_videoclips(final_clips_videos, method="compose") | |
final_video.write_videofile("final_countdown.mp4", fps=24) | |
# 임시 파일 삭제 및 메모리 해제 | |
for clip in final_clips_videos: | |
clip.close() | |
del final_clips_videos, final_video | |
# 임시 파일 삭제 | |
for temp_file in final_clips: | |
os.remove(temp_file) | |
# 실행 (카운트다운 생성 및 병합) | |
if __name__ == "__main__": | |
filenames = create_cute_preppy_countdown_video(3600) # 1시간 카운트다운 | |
merge_videos(filenames) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment