영상 전환 시 검은 화면이 나타나는 이유: 사전 로딩, 캐시와 끊김 없는 분기 재생
분기 전환 시 검은 화면이 나타나는 문제는 대개 플레이어의 ‘성능이 나쁘다’는 말로 설명할 만큼 단순하지 않습니다. 다음 영상이 아직 준비되지 않았거나, 첫 프레임이 디코딩되지 않았거나, 렌더링 텍스처가 비워졌거나, 두 영상 자체가 시각적으로 이어지지 않을 수 있습니다. 해결책은 인코딩, 사전 로딩, 두 플레이어 간 전환, 캐시 예산, 분기 출구 쇼트 설계를 함께 다뤄야 합니다.

들어가며
분기 전환 시 검은 화면이 나타나는 문제는 대개 플레이어의 ‘성능이 나쁘다’는 말로 설명할 만큼 단순하지 않습니다. 다음 영상이 아직 준비되지 않았거나, 첫 프레임이 디코딩되지 않았거나, 렌더링 텍스처가 비워졌거나, 두 영상 자체가 시각적으로 이어지지 않을 수 있습니다. 해결책은 인코딩, 사전 로딩, 두 플레이어 간 전환, 캐시 예산, 분기 출구 쇼트 설계를 함께 다뤄야 합니다.
검은 화면 발생 과정을 측정 가능한 단계로 나누기
플레이어가 선택을 제출한 순간부터 다음 영상의 첫 프레임을 볼 때까지는 경로 확정, 파일 위치 확인, 읽기, 컨테이너 파싱, 첫 프레임 디코딩, 텍스처 업로드, 오디오 시작, 화면 표시로 나눌 수 있습니다. 각 단계에 타임스탬프를 기록해야 어디에서 지연되는지 알 수 있습니다. ‘로딩에 500밀리초가 걸렸다’고만 기록하면 네트워크, 디스크, 키프레임 중 무엇이 원인인지 판단할 수 없습니다.
개발 화면에 현재 노드, 후보 노드, 준비 상태, 버퍼링된 재생 시간, 첫 프레임까지 걸린 시간을 표시하세요. 콜드 스타트와 두 번째 재생을 각각 테스트하세요. 두 번째는 매끄럽지만 첫 번째에 검은 화면이 나타난다면, 대개 캐시가 실제 문제를 가리고 있다는 뜻입니다.
선택지가 나타나기 전에 후보 출구 준비하기
플레이어가 곧 나타날 선택지를 알게 되면, 사용자가 클릭한 뒤에 로딩하는 대신 가능한 모든 다음 영상을 준비하기 시작해야 합니다. 후보가 두 개뿐이라면 두 영상의 첫 프레임과 소량의 버퍼를 사전 로딩할 수 있습니다. 후보가 많다면 선택 확률, 네트워크, 메모리에 따라 우선순위를 나누고, 최소한 기본 경로나 자주 선택되는 경로는 준비되도록 해야 합니다.
Unity의 VideoPlayer.Prepare는 재생을 미리 준비하고 완료 시 이벤트를 제공합니다. 이를 이용해 ‘파일 준비’를 선택 단계보다 앞당길 수 있지만, 대상 기기에서 디코딩과 렌더링 성능을 측정해야 합니다. Unity VideoPlayer.Prepare
두 플레이어 또는 두 텍스처로 화면 넘겨주기
단일 플레이어에서 URL을 바꾸면 현재 화면이 비워지는 경우가 많습니다. 더 안정적인 방법은 A가 현재 클립을 재생하고 B가 백그라운드에서 다음 클립을 준비하는 것입니다. 사용자가 선택을 제출할 때 B는 이미 첫 프레임에서 멈춰 있고, 한 프레임 안에 화면이 전환됩니다. 이후 A는 해제되어 앞으로의 후보를 준비합니다. 오디오도 동기화된 크로스페이드나 정확한 시점의 컷이 필요합니다.
두 플레이어를 사용하면 메모리, 디코더, 플랫폼 호환성에 드는 비용이 늘어납니다. 일부 모바일 기기는 고해상도 영상 두 개를 동시에 하드웨어 디코딩할 수 없으므로, 다음 영상의 첫 프레임 텍스처만 유지할 수 있는지, 또는 출구 지점에서 짧은 정지 프레임으로 아주 짧은 전환을 가릴 수 있는지 테스트해야 합니다. 가림은 미적 기법이지 무한정 기다리게 해도 된다는 핑계가 아닙니다.
인코딩이 재생 시작 속도를 결정한다
GOP가 길면 플레이어가 목표 프레임을 표시하기 위해 더 많은 이전 데이터를 거슬러 읽어야 할 수 있습니다. 분기 클립은 진입 지점 근처에 키프레임을 배치하고, 인코더, 해상도, 프레임 레이트, 색 공간, 오디오 설정을 통일해야 합니다. 두 영상의 설정이 다르면 플레이어가 디코딩 파이프라인을 다시 구성하면서 지연이나 깜빡임이 늘어날 수 있습니다.
키프레임 간격을 무작정 아주 짧게 줄이지 마세요. 파일 크기와 비트레이트가 증가합니다. 몇 가지 대표 기기를 선정해 실제 출구 클립으로 첫 프레임까지 걸리는 시간, 최대 메모리 사용량, 패키지 크기를 측정한 뒤 인코딩 프리셋을 정하세요.
영상의 연속성도 ‘가짜 검은 화면’을 만들 수 있다
기술적인 전환 시간이 0밀리초여도 출구와 진입 지점의 구도, 동작, 노출, 환경음이 이어지지 않으면 플레이어는 여전히 단절감을 느낍니다. 촬영할 때 출구 지점의 자세와 시선을 설계하고, 편집할 때 연결 가능한 프레임을 남기며, 환경음을 컷 전후로 연속해서 유지하세요. 필요하면 휴대전화 화면, 눈 깜빡임, 문에 의한 가림을 자연스러운 전환으로 활용하세요.
선택 인터페이스가 표시되는 동안 배경 영상은 긴장감을 유지하면서도 오래 멈춰 있을 수 있는 쇼트에서 정지해야 합니다. 인물의 입이 음절 중간에서 멈추거나 손이 공중에 떠 있으면, 어떤 대기 시간도 부자연스러워 보입니다.
캐시에 예산과 제거 규칙 설정하기
리소스를 현재 필수, 다음 단계 후보, 최근 되돌아가기용, 먼 이후의 콘텐츠로 나누세요. 기기의 메모리와 디스크에 맞춰 상한을 설정하고 현재 리소스와 후보를 우선 보존하며, 챕터를 벗어난 뒤에는 더 이상 도달할 수 없는 분기를 해제하세요. 캐시 키에는 에셋 버전과 인코딩 사양을 포함해 업데이트 후에도 이전 파일이 계속 재생되는 일을 방지하세요.
스트리밍 환경에서는 네트워크가 불안정할 때의 대응도 정해야 합니다. 안전한 버퍼가 확보된 뒤 선택을 활성화하거나, 비트레이트를 낮추거나, 챕터 전체를 미리 다운로드하거나, 명확한 로딩 화면을 표시할 수 있습니다. 카운트다운이 시작된 뒤에야 후보 영상이 준비되지 않았다는 사실을 발견해서는 안 됩니다.
검수 가능한 지표 만들기
선택 제출부터 다음 영상의 첫 프레임까지 걸리는 시간의 P50, P95, 최악값을 모두 측정해야 합니다. 동시에 영상과 음성의 동기화, 프레임 드롭, 최대 메모리 사용량, 실패 후 복구도 기록하세요. 저사양 대상 기기, 콜드 캐시, 백그라운드에서 복귀하는 상황, 리소스 다운로드 중단을 포함하세요. 지표는 작품의 호흡에 따라 달라지지만, ‘육안으로 알아차릴 수 없다’는 말이 데이터를 대신할 수는 없습니다.
준비에 실패하면 현재 화면을 유지하면서 재시도하거나, 비트레이트를 낮추거나, 설계된 대체 노드로 이동해야 합니다. 그대로 검은 화면에서 멈춰서는 안 됩니다. 실패할 때마다 로그에 에셋 ID, 오류, 기기 정보를 기록하세요.
마지막으로 선택 UI 자체도 측정에 포함하세요. 버튼 애니메이션 종료, 입력 잠금, 플레이어 전환 사이에 공백이 있으면 이 역시 로딩으로 오해될 수 있습니다. 화면 녹화를 프레임 단위로 확인해 성능 로그의 시간과 플레이어가 실제로 보는 시간이 일치하도록 하세요.
다음 단계: 가장 흔한 분기, 비트레이트가 가장 높은 분기, 가장 복잡한 분기 세 곳을 골라 콜드 캐시 상태의 대상 기기에서 단계별 시간을 측정하세요. 먼저 가장 심했던 검은 화면의 원인을 구체적인 단계로 좁힌 뒤, 인코딩, 로딩, 쇼트 중 무엇을 바꿀지 결정하세요.


