RAM 프리로딩으로 영상 재생 지연 제거하기
#회고 #게시글 작성중
시작 로딩 시간을 희생하고, 런타임 지연을 0으로 만들기
TL;DR
- 시작 화면에서 키보드를 누르면 영상이 재생되며 다음 씬으로 넘어가는 연출을 기획했다.
- 문제: 키를 누른 순간 영상이 바로 나오지 않고, 짧은 검은 화면 뒤에 재생되어 몰입감을 해쳤다.
- 원인은 영상의 로딩 시간이었다.
- 방송용 프로그램이라는 특성을 이용해, 실행 시 영상 리소스를 RAM에 미리 프리로딩하고, ffmpeg로 용량을 줄여 로딩 부담을 낮췄다.
- 결과: 키 입력 시 지연 없이 즉시 재생·씬 전환이 이루어져, 검은 화면 없는 자연스러운 트랜지션을 완성했고 시청자에게 긍정적인 평가를 받았다.
구현 배경
인상적인 연출을 위해 프로그램 내에 3D 영상을 도입하는 기획이 있었다. 시작 화면에서 키보드를 누르면 드래프트 시작을 알리는 영상이 재생되며 다음 씬으로 넘어가는 구조였다.
그런데 실제로 시작 화면에서 키보드를 누르자, 영상이 바로 재생되지 않고 짧은 시간 동안 검은 화면이 나타난 뒤에야 영상이 재생되는 문제가 발생했다. 이 짧은 공백이 시청자의 몰입감을 저해하는 요소라고 판단했다.
연출의 핵심은 "키를 누르는 순간 → 즉시 영상"이라는 매끄러운 흐름인데, 중간에 검은 화면이 끼면 그 리듬이 깨진다. 반드시 없애야 하는 문제였다.
원인 분석
문제의 원인은 영상의 로딩 시간이었다.
키를 누른 시점에 영상 파일을 열고 디코더를 준비하고 첫 프레임을 읽어오는 과정이 필요한데, 이 준비 시간 동안 화면에 아무것도 없어 검은 화면이 나타났던 것이다. 즉, 재생 명령과 실제 첫 프레임 출력 사이에 불가피한 준비 지연이 존재했다.
일반적인 상황이라면 이 정도 지연은 로딩 인디케이터 등으로 가릴 수 있지만, 이 연출은 "키 입력 = 즉시 반응" 이 생명이라 그런 우회가 통하지 않았다.
해결: 프로그램 특성을 이용한 프리로딩
이 프로그램은 방송용이라는 특성이 있었다. 즉, 실행(준비) 단계와 실제 방송(런타임) 단계가 명확히 분리되어 있다. 방송 시작 전에 프로그램을 미리 켜두는 것이 자연스러운 워크플로우다.
이 특성을 역이용하기로 했다. "실행 시 로딩은 오래 걸려도 되지만, 그 이후 런타임에는 어떤 지연도 없어야 한다" 는 방향으로 프로그램을 구성한 것이다.
구체적으로,
- 프로그램 실행 시 영상 리소스를 미리 RAM에 로딩한다. 디스크에서 읽어 디코딩 준비까지 끝내 둔다.
- 그 결과 키보드를 누르는 시점에는 이미 메모리에 준비된 영상을 즉시 재생만 하면 되므로, 디스크 접근·준비로 인한 지연이 사라진다.
즉, 지연을 없앤 게 아니라 시청자가 보지 않는 실행 단계로 옮긴 것이다.
ffmpeg로 로딩 부담 줄이기
프리로딩은 영상을 통째로 메모리에 올리는 방식이라, 원본 용량이 크면 그만큼 로딩 시간과 메모리 사용량이 커진다. 그래서 ffmpeg를 사용해 영상 용량을 줄였다. 연출에 필요한 화질을 유지하는 선에서 코덱·비트레이트·해상도를 조정해, 프리로딩에 드는 시간과 메모리를 함께 낮췄다.
예: 코덱/비트레이트를 조정해 용량 최적화 (실제 파라미터는 화질 기준에 맞게 튜닝)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -vf "scale=1280:-2" output.mp4
crf: 화질/용량 트레이드오프 (값이 클수록 용량↓ 화질↓)
preset: 인코딩 시간 vs 압축 효율
vf scale: 필요 이상으로 큰 해상도를 낮춰 용량 절감
트레이드오프: 무엇을 희생했나
이 해결책의 본질은 "시작 로딩 시간 ↔ 런타임 지연"의 교환이다.
- 희생한 것: 프로그램 실행 시 로딩이 길어진다. 영상을 미리 메모리에 올리므로 메모리 사용량도 늘어난다.
- 얻은 것: 런타임에는 키 입력 → 재생 사이의 지연이 0에 수렴한다.
일반적인 게임/앱이라면 시작 로딩이 길어지는 건 오히려 나쁜 UX다. 하지만 방송용 프로그램은 방송 전에 미리 켜두는 것이 전제이므로, 시작 로딩 시간은 사실상 비용이 아니다. 즉, 프로그램의 사용 맥락을 정확히 파악했기 때문에 성립하는 트레이드오프였다. 맥락이 달랐다면 다른 선택(스트리밍 디코딩, 첫 프레임만 프리로딩 등)을 했을 것이다.
결과
- 키보드를 누른 즉시, 검은 화면 없이 바로 영상이 재생되고 씬이 전환되도록 구현했다.
- 자연스러운 트랜지션 연출이 완성되었고, 시청자들에게 참신한 연출이라는 긍정적인 평가를 받았다.
- ffmpeg 최적화로 프리로딩에 드는 시간·메모리 부담도 함께 줄였다.
회고 / 배운 점
- 성능 문제는 항상 "빠르게 만들기"가 아니라, 지연을 사용자가 신경 쓰지 않는 시점으로 옮기기로도 풀 수 있다는 걸 배웠다. 프리로딩은 그 대표적인 패턴이다.
- 최적의 해법은 그 소프트웨어가 쓰이는 맥락에서 나온다. "방송용이라 실행 단계와 런타임이 분리된다"는 특성을 인지한 게 이 해결의 핵심이었다.
- (심화 방향) 영상이 많거나 매우 크다면, 전체 프리로딩 대신 첫 몇 초만 메모리에 올리고 나머지는 백그라운드 스트리밍하는 하이브리드 방식으로 메모리와 지연을 동시에 관리할 수 있다.
이 글도 "검은 화면이 있던 버전 vs 없앤 버전" 비교 GIF가 있으면 효과가 확실하게 전달된다.
