FFmpeg로 대용량 영상을 자르다가 정말 당황스러운 상황을 겪는 분들이 많습니다.
✔ 원본: 27GB / 12시간
✔ 처음 2시간만 잘랐는데 25GB
✔Non-monotonic DTS오류 발생
✔ “혹시 나머지 9시간이 깨져서 2시간에 몰린 건가요?”
결론부터 말하면 그건 아닙니다.
이 오류는 “데이터가 몰렸다”는 뜻이 아니라, 타임스탬프(DTS/PTS)가 꼬여 있다는 경고에 가깝습니다.
1️⃣ Non-monotonic DTS 오류, 정확히 무슨 뜻일까?
🔍 핵심만 정리하면
- DTS = 디코딩 타임스탬프
Non-monotonic= 시간이 앞뒤로 뒤섞여 있음- FFmpeg가
👉 “영상 시간 정보가 이상해서 자동으로 고쳐서 처리할게요”
라고 알려주는 메시지입니다.
📌 의미 없는 오류 아님 / 데이터 손실 알림도 아님
📌 하지만 무손실 컷(-c copy) 작업에선 결과가 꼬일 수 있음
2️⃣ “2시간이 25GB”가 나온 진짜 이유
아래 중 하나 이상일 가능성이 큽니다.
❌ 흔한 오해
“나머지 9시간이 오류라서 앞에 몰렸다”
👉 거의 아닙니다.
✅ 실제 원인 후보
- VBR(가변 비트레이트)
→ 앞부분 2시간이 고비트 구간일 수 있음 -c copy+ 키프레임 문제
→ 컷 지점이 정확히 적용 안 됨- 타임스탬프 깨짐
→ FFmpeg가 duration/seek를 잘못 해석 - 사실상 끝까지 포함된 파일인데
재생 시간만 2시간처럼 보이는 경우
3️⃣ 지금 당장 해야 할 1단계: 파일 정상 여부 확인
✔ 잘린 파일이 진짜 2시간인지 확인
ffprobe -v error -show_entries format=duration -of default=nw=1 out_2h.mp4
✔ 스트림 오류 위치 확인
ffmpeg -v warning -i input.mp4 -f null - 2> warn.txt
warn.txt에Non-monotonic DTS가 어느 시점부터 나는지 확인하세요.
4️⃣ 가장 안전한 무손실 컷 방법 (추천 ⭐)
✅ 방법 ① 타임스탬프 재생성 + 컷
ffmpeg -ss 0 -i input.mp4 -t 02:00:00 \
-map 0 -c copy \
-fflags +genpts \
-reset_timestamps 1 \
-avoid_negative_ts make_zero out_2h.mp4
✔ 데이터 재인코딩 ❌
✔ DTS 꼬임 대부분 해결
✔ 용량 정상화 확률 높음
5️⃣ 그래도 안 되면: 리먹스 후 다시 자르기
원본 컨테이너 인덱스가 깨진 경우에 효과적입니다.
✅ 방법 ② 리먹스(재포장) 먼저
ffmpeg -i input.mp4 -map 0 -c copy -fflags +genpts fixed.mp4
그 다음:
ffmpeg -ss 0 -i fixed.mp4 -t 02:00:00 \
-map 0 -c copy \
-avoid_negative_ts make_zero out_2h.mp4
6️⃣ 정말 급하면 최후의 방법 (확실하지만 무손실 아님)
❗ 재인코딩 컷 (DTS 문제 거의 100% 해결)
ffmpeg -ss 0 -i input.mp4 -t 02:00:00 \
-c:v libx264 -preset veryfast -crf 18 \
-c:a aac -b:a 192k out_2h_reencode.mp4
✔ 용량 정상
✔ 시간 정확
✔ 오류 사라짐
❌ 약간의 화질 손실 (CRF 18이면 체감 거의 없음)
7️⃣ 자주 묻는 질문 (FAQ)
Q. Non-monotonic DTS 오류면 영상이 망가진 건가요?
A. 아닙니다.
시간 정보만 꼬였을 뿐 데이터 자체가 손실됐다는 의미는 아닙니다.
Q. 왜 대용량 녹화 파일에서 자주 생기나요?
A.
- 장시간 녹화
- OBS/캡처카드
- 일시정지·드롭프레임
이런 환경에서 타임스탬프가 쉽게 깨집니다.
Q. -c copy는 항상 안전한가요?
A. 아닙니다.
타임스탬프가 깨진 파일엔 오히려 위험할 수 있습니다.
🔚 핵심 요약
✔ 2시간에 25GB → 나머지 9시간 몰린 게 아님
✔ Non-monotonic DTS = 시간 정보 꼬임 경고
✔ 무손실 컷 시 타임스탬프 옵션 필수
✔ 안 되면 리먹스 → 그래도 안 되면 재인코딩