4.7 자주 만나는 FFmpeg 오류와 해결
moov atom not found, Could not find tag for codec, Non-monotonic DTS, 비트레이트 단위 실수, 오디오 누락, 4:2:2 재생 불가 등 현장에서 자주 보는 문제를 재현하고 해결하는 방법을 정리합니다.
이 글의 사례는 모두 직접 재현한 것입니다. 오류 메시지는 FFmpeg 버전에 따라 문구가 다를 수 있으니 핵심 단어를 기준으로 찾으세요.
#1) moov atom not found
[mov,mp4,m4a,3gp,3g2,mj2 @ ...] moov atom not found
nf_trunc.mp4: Invalid data found when processing input
원인: MP4의 moov(목차)가 없습니다. moov가 파일 끝에 있는 MP4(기본 FFmpeg 출력)가 녹화·전송 중간에 잘렸을 때 발생합니다.
재현: 3초짜리 MP4를 만든 뒤 앞 20,000바이트만 남겼습니다. moov가 앞에 있는 faststart 파일은 같은 방식으로 잘라도 열렸다는 점이 2장 설명과 일치합니다.
대응
- 데이터(
mdat)가 남아 있어도moov없이는 일반 도구로 읽을 수 없습니다. 같은 설정으로 만든 정상 파일을 참고 파일로 사용하는 복구 도구를 쓰거나, 원본을 다시 받아야 합니다. - 예방: 녹화나 라이브 캡처는 프래그먼트 MP4(
-movflags frag_keyframe+empty_moov)나 TS처럼 중단에 강한 포맷으로 기록한 뒤 완료 후 MP4로 재래핑합니다.
#2) Could not find tag for codec ... in stream
[mp4] Could not find tag for codec prores in stream #0, codec not currently supported in container
Could not write header (incorrect codec parameters ?): Invalid argument
원인: 코덱이 해당 컨테이너에 들어갈 수 없습니다. 위는 -c copy로 ProRes를 MP4에 넣으려 한 경우입니다.
대응: 컨테이너를 MOV나 MXF로 바꾸거나, MP4에 넣을 수 있는 코덱(H.264 등)으로 재인코딩합니다. 컨테이너별 허용 코덱은 2장의 표를 참고하세요.
#3) Non-monotonic DTS
[aost#0:1/copy] Non-monotonic DTS; previous: 192512, current: 192000; changing to 192513.
This may result in incorrect timestamps in the output file.
원인: 패킷의 디코딩 시각(DTS)이 거꾸로 갑니다. 방송 TS를 cat으로 이어 붙이거나, 편성 전환 지점에서 PCR/PTS가 되감긴 파일을 -c copy로 처리하면 나타납니다.
재현: 같은 TS를 두 번 이어 붙여(cat a.ts a.ts > joined.ts) 복사 변환했더니 위 경고가 나왔습니다. 그리고 8초 분량(4초×2)을 이어 붙였는데도 joined.ts의 길이는 4.02초로만 표시되었습니다. 두 번째 조각의 타임스탬프가 처음으로 되감겼기 때문입니다.
대응
- TS를 단순 이어붙이기하지 말고 concat demuxer나 재인코딩으로 합칩니다.
- 방송 녹화 TS에서 편성 전환 구간이 있다면 구간 단위로 분리해 각각 변환합니다.
- 오디오·비디오 싱크가 중요한 경우
-c copy대신 재인코딩합니다.-fflags +genpts는 DTS는 있는데 PTS가 빠진 패킷의 PTS를 만들어 주는 옵션이며, 이미 잘못 기록된 PTS나 불연속 타임스탬프를 일반적으로 바로잡아 주지는 않습니다. 어느 쪽이든 결과의 싱크를 반드시 검증하세요.
#4) 비트레이트 단위 실수
-b:v 1000 # 1000 bps
-b:v 1000k # 1000 kbps
같은 2초 영상을 두 값으로 인코딩했더니 크기가 달랐습니다.
-b:v 1000 → 3,170바이트
-b:v 1000k → 225,302바이트
k가 없으면 1000bps입니다. 영상이 아주 작고 심하게 깨진 결과가 나오면 단위부터 확인하세요. 대용량 변환의 설정값은 코드 안에 숫자로 쓰지 말고 단위 포함 문자열("1000k", "50M")로 관리하는 것이 안전합니다.
#5) 오디오 트랙이 사라짐
증상: 변환 결과에 소리가 하나밖에 없거나, 원본에 있던 해설 트랙이 없다.
원인: -map을 쓰지 않으면 FFmpeg는 오디오를 1개만 선택합니다(1편에서 재현). 8트랙 모노 MXF를 -c:a aac로 변환하자 오디오가 1개만 남았습니다.
대응: -map 0 또는 필요한 트랙을 명시하고, 변환 후 스트림 개수를 검증합니다.
#6) 브라우저·모바일에서 재생되지 않는 H.264
증상: 파일은 정상인데 Chrome·iPhone에서 검은 화면이거나 재생되지 않는다.
원인: 입력이 4:2:2나 4:4:4이고 -pix_fmt를 지정하지 않아 H.264 High 4:2:2 / High 4:4:4 Predictive 프로파일로 만들어졌습니다. 4:4:4 입력을 그대로 인코딩했을 때 profile=High 4:4:4 Predictive, pix_fmt=yuv444p로 나오는 것을 확인했습니다. 대부분의 하드웨어 디코더와 브라우저는 이 프로파일을 지원하지 않습니다.
대응: 웹용은 항상 -pix_fmt yuv420p를 지정하고, 결과를 FFprobe로 확인합니다.
#7) 프레임 수나 길이가 다르다
증상: 변환 결과의 길이가 원본과 수십~수백 ms 다르다. 또는 오디오와 영상 길이가 다르다.
확인: VFR 파일의 경우, 비디오와 오디오의 스트림 길이가 각각 5.005초와 5.013초로 달랐습니다. 이런 값은 컨테이너에 따라 정상 범위일 수 있습니다(AAC는 프레임 단위 패딩이 있음).
판단: 길이 차이가 0.1~0.5초 이내이면 보통 정상으로 보고, 이를 넘으면 오류로 처리하는 식으로 허용 오차를 정해 두세요(앞의 배치 코드는 0.5초를 기준으로 했습니다).
#8) 변환은 됐는데 화질이 이상하다
| 증상 | 의심 원인 | 확인 |
|---|---|---|
| 움직이는 물체에 빗살 무늬 | 디인터레이스 누락 | Scan type(MediaInfo) |
| 색이 탁하거나 밝기가 다름 | 색 범위(limited/full), 색 공간 | Color range, color_space |
| 화면이 눌리거나 늘어남 | SAR/DAR 미처리 | Pixel aspect ratio |
| 블록 노이즈, 번짐 | CRF가 너무 높음, 비트레이트 부족 | 설정값 |
| 상하가 뒤집힘/회전 | 모바일 영상의 회전 메타데이터 | Rotation(MediaInfo) |
#오류 조사의 기본 순서
- 로그 수준을 올려 처음 나온 오류를 찾습니다(
-v warning또는-v info). 마지막 오류는 결과일 뿐 원인이 아닌 경우가 많습니다. - 입력 파일을 분석합니다(3장). 대부분의 문제는 입력의 특성(VFR, 인터레이스, 손상, 비표준 코덱)에서 시작합니다.
- 최소 명령으로 줄입니다. 필터와 옵션을 하나씩 빼며 문제가 사라지는 지점을 찾습니다.
- 짧은 구간(
-t 10)으로 재현해서 시도 시간을 줄입니다. - 해결한 뒤에는 샘플 파일과 명령을 회귀 테스트로 보관합니다.
#정리
- 오류는 대부분 입력 파일의 특성, 컨테이너·코덱 호환, 옵션 단위 실수에서 비롯됩니다.
- 변환 후에는 스트림 구성, 길이, 프로파일(
yuv420p등)을 검증하는 습관이 장애를 줄입니다. - 오류를 해결하면 샘플과 명령을 보관해 같은 문제가 재발하지 않도록 합니다.
다음 장에서는 이런 변환과 분석을 조합해서 MAM 시스템을 설계하는 방법을 다룹니다.
#참고 자료
링크는 2026-10-28에 열람이 되는 것을 확인했습니다. 규격과 도구 문서는 개정될 수 있으므로 적용하기 전에 최신 판을 확인하세요.