파이썬으로 만드는 영화 리뷰 숏츠 제작 자동화 파이프라인 (moviepy & PyQt5)

안녕하세요, 회원 여러분! 파이썬을 활용해 반복되는 일상을 시스템으로 구축하는 것을 즐기는 개발자입니다.
Automating video production saves countless hours of repetitive work.
(영상 제작을 자동화하면 수많은 반복 작업 시간을 아낄 수 있습니다.)
최근 쇼츠(Shorts) 포맷의 영화 리뷰 및 소개 영상을 제작할 일이 생겼는데, 영화 스틸컷 수집부터 예고편 다운로드, 9:16 모바일 세로 비율 맞추기, 하단 텍스트 레이어 합성까지 매번 손으로 작업하려니 상당한 피로감과 비효율이 발생했습니다.
그래서 파이썬의 MoviePy, TMDB API, yt-dlp, 그리고 PyQt5를 결합하여 버튼 클릭 한 번으로 고화질 영화 숏츠 영상이 완성되는 자동화 파이프라인을 구축해 보았고, 그 과정에서 겪은 영상 처리 실무 팁을 공유하고자 합니다.
1. 핵심 코드 구조 및 데이터 흐름
전체 시스템은 TMDB API를 통해 영화 스틸컷과 기본 정보를 수집하고, yt-dlp로 유튜브 공식 예고편 소스를 확보한 뒤, MoviePy를 이용해 9:16 모바일 비율로 동적 합성하여 PyQt5 비동기 스레드에서 인코딩을 수행하는 구조입니다.
아래는 비주얼 클립을 역동적으로 교차 편집하고 앰비언트 배경을 합성하는 핵심 비동기 스레드 코드 스니펫입니다.
Python
# 파일명: movie_shorts_generator.py
# 목적: 영화 예고편 및 스틸컷 기반 숏츠 자동 제작 스레드 로직
import os
import random
import gc
import shutil
from PyQt5.QtCore import QThread, pyqtSignal
from moviepy import (
VideoFileClip, CompositeVideoClip, concatenate_videoclips,
concatenate_audioclips, TextClip, ImageClip, ColorClip
)
from tracker_hub import log_app_usage
class VideoMakerThread(QThread):
log_signal = pyqtSignal(str)
progress_signal = pyqtSignal(int)
finish_signal = pyqtSignal(str)
def __init__(self, movie_info):
super().__init__()
self.movie_info = movie_info
self._is_running = True
def run(self):
try:
# 트래커 사용량 기록
log_app_usage("movie_shorts_maker", "render_started", {"title": self.movie_info['title']})
target_width, target_height = 720, 1280
shorts_duration = 45.0
# (TMDB 이미지 및 yt-dlp 예고편 다운로드 과정 수행)
# 1. 앰비언트 메인 비디오 스트림 교차 구성
raw_stream = concatenate_videoclips(visual_clips, method="compose").subclipped(0, shorts_duration)
# 2. 9:16 세로 비율 앰비언트 배경 연출 (어두운 오버레이 레이어)
bg_full = raw_stream.resized(height=target_height).cropped(
width=target_width, height=target_height,
x_center=target_width/2, y_center=target_height/2
)
dark_overlay = ColorClip(size=(target_width, target_height), color=(0,0,0)).with_duration(shorts_duration).with_opacity(0.8)
center_video = raw_stream.with_position('center')
visual_layers = [bg_full, dark_overlay, center_video]
# 3. 상단 및 하단 텍스트 자막 레이어 합성
title_text = TextClip(
text=f"{self.movie_info['title']}\n",
font="C:/Windows/Fonts/malgunbd.ttf",
font_size=60, color='yellow', stroke_color='black', stroke_width=2
).with_position(('center', 250)).with_duration(shorts_duration)
visual_layers.append(title_text)
# 4. 최종 비디오/오디오 레이어 결합 및 인코딩
final_video = CompositeVideoClip(visual_layers, size=(target_width, target_height))
final_out_path = "outputs/final_shorts.mp4"
final_video.write_videofile(
final_out_path, fps=24, codec="libx264",
audio_codec="aac", preset="ultrafast"
)
self.finish_signal.emit("성공|작업완료")
except Exception as e:
self.log_signal.emit(f"오류 발생: {e}")
self.finish_signal.emit("실패|0")
finally:
# 리소스 해제 및 가비지 컬렉션
gc.collect()
2. 주요 라이브러리 및 클래스 해부
MoviePy (VideoFileClip, CompositeVideoClip, TextClip): 파이썬 환경에서 비디오 및 오디오 클립을 타임라인 단위로 자르고, 크롭하고, 여러 레이어로 정밀하게 합성해 주는 대표적인 미디어 편집 라이브러리입니다.
yt-dlp: 다양한 웹 플랫폼의 고화질 비디오 스트림 및 예고편 소스를 파이썬 환경에서 안정적으로 추출해 주는 오픈소스 모듈입니다.
PyQt5 QThread: 영상 인코딩처럼 CPU 사용량이 높은 작업을 메인 UI 스레드와 분리하여, 렌더링 중에도 GUI 화면이 멈추거나 튕기는 현상을 방지하는 비동기 클래스입니다.
3. 실무 비법 소스 & 트러블슈팅
인터넷의 일반적인 자동화 예제를 보면 단순히 오디오와 비디오를 붙이는 교과서적인 방법만 나옵니다. 하지만 실제 쇼츠 제작 현업에서는 다음과 같은 가혹한 문제들을 해결해야 합니다.
Reality requires careful handling of video ratios, memory leaks, and encoding bottlenecks.
(현실에서는 비디오 비율, 메모리 누수, 인코딩 병목 현상을 세심하게 처리해야 합니다.)
9:16 모바일 비율 레터박스 해결 (앰비언트 배경 연출): 일반적인 16:9 가로 예고편을 9:16 세로 쇼츠로 만들 때 그냥 세로로 늘리면 화면 양옆이 심하게 잘립니다. 이를 해결하기 위해 원본 영상을 세로로 크게 확대해 배경에 깔고, 투명도 0.8의 어두운 필터(ColorClip)를 씌운 뒤 그 중앙에 원본 비율 영상과 자막을 배치하여 고품질 앰비언트 숏츠를 연출했습니다.
PyQt5 한글 IME 씹힘 버그 대처: Windows 환경의 PyQt5 QLineEdit 입력창에서 한글을 입력할 때 초성이 씹히거나 한영 전환이 안 되는 문제가 발생합니다. ctypes.windll.imm32 라이브러리를 활용해 포커스가 들어오는 순간 한글 입력기(IME) 상태를 강제로 활성화하도록 조치했습니다.
렌더링 병목 및 메모리 누수 관리: 반복문 안에서 미디어 클립 객체를 계속 생성하면 파이썬 프로세스 메모리가 급격히 늘어나 시스템이 뻗어버립니다. try-finally 구문 내에서 gc.collect()와 임시 폴더 삭제(shutil.rmtree)를 강제로 실행하여 연속 작업 시의 안정성을 확보했습니다.
4. 빌드 환경 세팅 (pyproject.toml)
영상 처리 패키지는 시스템 C 라이브러리 및 FFmpeg 바이너리와 밀접하게 연결되어 있습니다. 기존의 requirements.txt 방식 대신 표준 pyproject.toml 기법을 도입하여 의존성을 세련되게 관리했습니다.
Ini, TOML
[project]
name = "movie-shorts-maker"
version = "0.1.0"
description = "TMDB 및 MoviePy 기반 쇼츠 자동 제작 파이프라인"
requires-python = ">=3.9"
dependencies = [
"pyqt5",
"moviepy",
"yt-dlp",
"requests",
"python-dotenv"
]
5. 마무리 소통 및 시연 영상 안내
구체적인 프로그램 기획부터 터미널에서 코드가 실행되며 실시간으로 쇼츠 결과물이 렌더링되는 꿀잼 시연 영상은 유튜브 채널에서 확인해 보실 수 있습니다.
유튜브 시연 영상: https://www.youtube.com/watch?v=3m4AEVO1swg
GitHub 전체 소스 코드: https://github.com/gohard-lab/movie_shorts_maker
워드프레스: https://gohard.pe.kr/
실행 파일 (.exe 다운로드): https://github.com/gohard-lab/movie_shorts_maker/releases (Releases / Assets 항목에서 안심하고 다운로드 가능)
직접 적용해 보시면서 막히는 부분이나 에러 로그가 있다면 댓글로 편하게 남겨주세요. 개발자분들의 많은 관심과 피드백 부탁드립니다!