유튜브 채널 [통찰의 바이블]을 운영하면서, Pexels에서 받은 아름다운 자연 영상을 배경으로 사용하고 있습니다. 하지만 밝은 대낮 영상 위에 흰색 자막을 올리면 가독성이 떨어지는 문제가 있었죠.
단순히 화면 전체를 어둡게 하거나 검은 띠를 넣는 방법도 있지만, 저는 조금 더 욕심을 냈습니다.
"화면 상단은 원본의 아름다움을 살리면서, 자막이 올라올 하단만 자연스럽게 어둡게 할 수는 없을까?"
마치 영화나 다큐멘터리처럼, 인위적인 느낌 없이 화면 하단에 부드럽게 깔리는 '시네마틱 그라데이션'을 구현하고 싶었습니다. 오늘은 영상 편집의 맥가이버 칼, FFmpeg와 파이썬을 이용해 이 문제를 해결한 과정을 공유합니다.
1. 문제 정의: 우리가 원하는 '이상적인' 화면
우리가 만들고 싶은 화면은 3가지 조건을 만족해야 합니다. (1920x1080 FHD 기준)
- 상단 (0px ~ 820px): 원본 영상의 느낌을 살리기 위해 아주 옅게(10%)만 톤 다운.
- 하단 (840px ~ 1080px): 자막 가독성을 위해 확실하게(60%) 어둡게 처리.
- 경계 (820px ~ 840px): 두 구역이 뚝 끊겨 보이지 않도록 아주 부드러운 그라데이션으로 연결.
이것을 편집 프로그램에서 영상마다 수작업으로 하려면 너무나 많은 시간이 걸립니다. 하지만 FFmpeg를 이용하면 단 한 번의 코딩으로 모든 영상에 일괄 적용할 수 있습니다.
2. 해결 원리: '마스크'와 '오버레이'의 마법
FFmpeg로 이 효과를 구현하는 원리는 마치 '판화'를 찍는 것과 같습니다.
- '그라데이션 도장' 만들기: 먼저 우리가 원하는 모양의 흑백 그라데이션 이미지를 코드로 생성합니다. 이 이미지를 '알파 마스크(Alpha Mask)'라고 부릅니다. 이 마스크에서 밝은 부분은 투명하게, 어두운 부분은 불투명하게 처리될 영역입니다.
- '검은색 물감' 준비: 화면 전체를 덮을 검은색 레이어를 준비합니다.
- '도장 찍기': 검은색 레이어 위에 '그라데이션 도장'을 찍어 '반투명 그라데이션 오버레이'를 완성합니다.
- '덮어쓰기': 마지막으로 원본 영상 위에 이 반투명 오버레이를 덮어씌우면 끝입니다.
이 복잡한 과정을 FFmpeg의 geq 필터와 alphamerge, overlay 필터가 자동으로 처리해 줍니다.
3. 최종 파이썬 코드 (FFmpeg 자동화 스크립트)
이 코드는 어떤 영상이든 위에서 정의한 3단 그라데이션 오버레이를 적용해 주는 함수입니다.
(사전 준비: pip install ffmpeg-python 라이브러리를 설치해야 합니다.)
import ffmpeg
def add_3stage_gradient_overlay(input_video, output_video,
top_opacity=0.1, bottom_opacity=0.6,
feather_start_y=820, feather_end_y=840):
"""
영상 위에 3단계(상단/중간/하단) 투명도를 가진 그라데이션 오버레이를 추가합니다.
"""
try:
# 1. 원본 영상 입력 및 정보 확인
main_video = ffmpeg.input(input_video)
height = main_video.video.height
width = main_video.video.width
# 2. 흑백 그라데이션 '알파 마스크' 생성 (핵심 로직)
# geq 필터를 사용하여 픽셀의 Y좌표에 따라 밝기(lum)를 조절
alpha_mask = ffmpeg.input(f'color=c=white:s={width}x{height}', f='lavfi') \
.format('gray') \
.filter_('geq',
lum=f"""
if(
lt(Y, {feather_start_y}),
255 - (255 * {top_opacity}),
if(
lt(Y, {feather_end_y}),
(255 - (255 * {top_opacity})) - ((255 * ({bottom_opacity} - {top_opacity})) * (Y - {feather_start_y}) / ({feather_end_y} - {feather_start_y})),
255 - (255 * {bottom_opacity})
)
)
"""
)
# 3. 검은색 배경에 위에서 만든 알파 마스크를 적용하여 '반투명 오버레이' 생성
black_overlay = ffmpeg.input(f'color=c=black:s={width}x{height}', f='lavfi')
# alphamerge 필터는 흑백 마스크를 투명도 정보로 변환해 줍니다.
transparent_overlay = ffmpeg.filter_([black_overlay, alpha_mask], 'alphamerge')
# 4. 원본 영상 위에 완성된 오버레이를 덮어씌웁니다.
processed_stream = ffmpeg.overlay(main_video, transparent_overlay)
# 5. 최종 영상 출력 (오디오는 원본 그대로 사용)
final_output = ffmpeg.output(processed_stream, main_video['a'], output_video, vcodec='libx264', crf=23)
ffmpeg.run(final_output, overwrite_output=True)
print(f"✅ 3단 그라데이션 오버레이 적용 완료: {output_video}")
except ffmpeg.Error as e:
print(f"❌ 에러 발생: {e.stderr.decode('utf8')}")
# --- 실행 부분 ---
if __name__ == "__main__":
video_file = "background_video.mp4" # 원본 영상 파일
output_file = "video_with_gradient.mp4" # 저장될 파일 이름
# 함수 호출 (상단 10%, 하단 60%, 중간(820-840)은 그라데이션)
add_3stage_gradient_overlay(video_file, output_file,
top_opacity=0.1, bottom_opacity=0.6,
feather_start_y=820, feather_end_y=840)
코드 분석 (geq 필터)
geq 필터 안의 if문이 바로 이 마법의 핵심입니다.
if(lt(Y, 820), ...): 만약 현재 픽셀의 Y좌표가 820보다 작으면(상단부), 밝기를 90%(255 * 0.9)로 고정합니다. 이는 10%의 불투명도를 의미합니다.if(lt(Y, 840), ...): 820-840 사이 구간에서는 Y좌표에 비례하여 90%에서 40%로 밝기가 점차 어두워지는 선형 보간 수식을 적용합니다.- 나머지(하단부): Y좌표가 840 이상이면, 밝기를 40%(
255 * 0.4)로 고정합니다. 이는 60%의 불투명도를 의미합니다.
🚀 결론: 자동화로 얻는 시간과 품격
이 스크립트를 한 번 만들어두면, 앞으로 Pexels에서 어떤 영상을 다운로드하든 실행 한 번으로 '통찰의 바이블'만의 시그니처 룩을 입힐 수 있습니다.
단순히 어둡게만 하는 것이 아닌, 정교하게 계산된 그라데이션은 시청자가 눈치채지 못하는 사이에 영상의 몰입도를 높여주는 강력한 도구입니다. 기술을 통해 예술을 구현하는 과정, 여러분도 도전해 보세요
'디자인 인사이트 > 동영상 만들기' 카테고리의 다른 글
| [완벽 가이드] Python과 FFmpeg로 전문가급 오디오북 영상 자동 제작하기 (0) | 2026.01.14 |
|---|---|
| 평범한 SRT 자막은 이제 그만! Python으로 영상 퀄리티를 높이는 ASS 자동 변환 비법 (0) | 2026.01.14 |
| FFmpeg로 넷플릭스 자막 만들기: PNG 그라데이션 하단 바 적용법 (0) | 2026.01.13 |
| ASS 자막 완벽 가이드: 옵션 해부로 전문가 되기 (0) | 2026.01.13 |
| 무료 영상(Pexels)을 '다큐멘터리'처럼 만드는 영상 보정 3단계 시크릿 (톤 다운, 컬러, 비네팅) (0) | 2026.01.12 |
댓글