Skip to content

Instantly share code, notes, and snippets.

@koorukuroo
Created September 12, 2024 12:25
Show Gist options
  • Save koorukuroo/e0a59fd7116d62aa24a3a6460227dadd to your computer and use it in GitHub Desktop.
Save koorukuroo/e0a59fd7116d62aa24a3a6460227dadd to your computer and use it in GitHub Desktop.
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