영상은 멈추고 소리만 나올 때: 원인과 해결 방법
어떤 플레이어에서든 영상은 멈추고 소리만 계속 나온다면 파일에 정지된 프레임이 들어 있습니다. 스트림 확인 방법과 Sume 렌더에서 생기는 세 가지 원인을 정리했습니다.

어떤 플레이어로 재생해도 영상이 멈추고 소리만 계속 나온다면, 파일 자체에 정지된 프레임이 들어 있는 것입니다. 소리가 끝나기 전에 화면이 멈추거나, 잠시 정지하거나, 먼저 끝나 버린 경우입니다. 한 플레이어나 한 기기에서만 멈춘다면 파일에는 문제가 없고 재생 쪽 문제이며, 이 글에서는 다루지 않습니다. Sume Timeline 렌더에서는 세 가지 배치가 프레임을 정지시키며, 렌더는 각각을 warnings[]에 보고합니다.
ffprobe와 FFmpeg 관련 사실은 ffprobe와 ffmpeg 문서에서, Sume 관련 사실은 Timeline 1.0과 영상 검사 문서, Sume API 레퍼런스에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 경고 코드와 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.
파일 자체가 멈추는지는 어떻게 확인하나요?
화면이 재생되는 길이와 소리가 재생되는 길이를 비교하세요. ffprobe는 스트림마다 종류와 길이를 출력합니다. 아래 파일에서는 영상 스트림이 3초, 오디오가 5초에 끝나므로, 마지막 2초 동안은 소리만 있고 새 화면이 없습니다.
ffprobe -v error -show_entries stream=codec_type,duration -of csv=p=0 input.mp4
# video,3.000000
# audio,5.000000Sume Timeline 렌더는 왜 소리가 나는 동안 멈추나요?
렌더 출력은 항상 audio.duration_seconds만큼 재생되므로, 화면에 새로 보여 줄 것이 없으면 렌더는 일찍 끝나는 대신 프레임을 정지시켜 유지합니다. 원인이 되는 배치는 세 가지입니다. 이 경고들은 소프트 경고이므로 Job은 그대로 완료되고, 경고는 결과의 warnings[]에 담겨 돌아옵니다.
| 배치 | 렌더의 동작 | 경고 |
|---|---|---|
한 슬롯의 끝과 다음 슬롯의 start 사이의 틈 | 틈 동안 이전 프레임을 유지 | timeline_gap_filled |
마지막 슬롯이 audio.duration_seconds보다 먼저 끝남 | 오디오가 끝날 때까지 마지막 프레임을 유지 | video_coverage_shorter_than_audio |
슬롯의 source_in과 duration을 더한 값이 소스의 끝을 넘음 | render.pad_mode 설정에 따라 소스의 마지막 프레임을 유지하거나 소스를 루프 | segment_source_short_padded 또는 segment_source_short_looped |
render.pad_mode는 무엇을 바꾸나요?
세 번째 배치만 바꿉니다. render.pad_mode는 소스보다 긴 슬롯을 어떻게 채울지 정합니다. loop는 소스를 다시 재생하고, freeze는 마지막 프레임을 유지하며, 기본값인 auto는 긴 정지 화면을 두는 대신 짧은 소스를 루프합니다. auto가 언제 루프하고 언제 프레임을 유지하는지는 루프로 영상 길이를 늘리는 방법에서 자세히 설명합니다. 어떤 모드도 틈이나 짧은 마지막 슬롯에는 적용되지 않습니다. 현재 코드에서는 두 경우 모두 항상 프레임을 유지하므로, 배치 자체에서 고치세요. 의도한 정지 화면은 영상 프리즈 프레임 만드는 방법에서 다룹니다.
비용을 내기 전에 멈춤을 어떻게 잡아내나요?
같은 본문을 POST /v1/timeline-1.0/plan으로 보내세요. 이 호출은 과금되지 않고 미디어를 내려받지 않으며, duration_seconds와 함께 마지막 슬롯이 끝나는 지점인 coverage_seconds를 반환합니다. 커버리지가 더 짧으면 그 차이만큼 마지막 프레임이 정지됩니다. 현재 코드에서 plan 결과의 warnings에는 틈과 짧은 마지막 슬롯이 이미 나열되는데, 둘 다 여러분이 선언한 시작 시점과 길이로 알 수 있기 때문입니다.
plan 호출은 파일을 보지 않으므로 짧은 소스의 패딩이나 루프 경고는 예측하지 못합니다. 과금되지 않는 프로브로 각 소스의 길이를 먼저 확인하고(frames: false를 넣은 POST /v1/video-inspect는 probe.duration_seconds를 반환합니다), 모든 슬롯의 source_in과 duration을 더한 값이 그 길이를 넘지 않게 하세요. plan은 렌더링 전에 타임라인 검증하기에서 자세히 다룹니다.
멈추는 영상은 어떻게 고치나요?
- 틈을 없애세요. 각 슬롯을 이전 슬롯이 끝나는 지점, 즉 이전 슬롯의
start에duration을 더한 지점에서 시작하세요. - 마지막 슬롯이
audio.duration_seconds에서 끝나게 하거나, 오디오를 화면 길이에 맞게 줄이세요. - 소스가 짧다면 슬롯을 줄이거나,
source_in을 앞당기거나,render.pad_mode를"loop"로 설정해 소스를 다시 재생하세요. 현재 코드에서는 0.5초보다 짧은 소스는loop를 설정해도 마지막 프레임을 유지합니다. - 다른 곳에서 만든 파일이라면 FFmpeg의
-shortest를 쓰세요. 가장 짧은 스트림이 끝날 때 출력을 끝내므로, 화면이 없는 구간에서 재생되던 소리가 잘립니다. 명령은ffmpeg -i input.mp4 -c copy -shortest output.mp4입니다.-c copy는 재인코딩 없이 두 스트림을 그대로 유지합니다. - 두 스트림의 길이가 같다면 정지 화면은 영상 자체에 들어 있으므로, 그 화면을 만든 편집을 고치세요. 화면이 아예 나오지 않는다면 MP4 소리는 나는데 화면이 안 나오나요? 글을 참고하세요.
출처
관련 글
미디어 도구 카테고리의 다른 글
- WAV vs MP3 차이: 어느 쪽이 좋고 언제 무엇을 쓰나요?
WAV는 정확하지만 크고, MP3는 작지만 손실이 있습니다. 편집하거나 이어 붙이는 동안은 WAV를 유지하고 MP3는 마지막에 내보내세요. MP3를 WAV로 바꿔도 복원되는 것은 없습니다.
- MP4는 어떤 코덱을 쓰나요? MP4는 코덱이 아닌 컨테이너
MP4는 코덱이 아니라 컨테이너입니다. H.264, AAC처럼 서로 다른 코덱으로 압축한 영상과 오디오를 담습니다. 둘을 구분하는 방법을 설명합니다.
- 16:9 사이즈는 몇 픽셀인가요? 16:9·9:16 해상도 정리
16:9는 하나의 크기가 아니라 비율입니다. 1280 × 720, 1920 × 1080, 2560 × 1440, 3840 × 2160이 모두 16:9입니다. 크기 계산법과 만드는 법을 정리했습니다.
- X(트위터) 영상 광고 규격: 크기, 길이, 파일 규칙
X는 15초 이하의 영상 광고를 권장합니다. 파일은 최대 1 GB(30 MB 미만 권장), 29.97 또는 30 fps의 H.264이며, 크기는 9:16부터 1.91:1까지 여섯 가지입니다.
작성자 Sume