홈 › 4장 FFmpeg 실전 변환

4.7 자주 만나는 FFmpeg 오류와 해결

moov atom not found, Could not find tag for codec, Non-monotonic DTS, 비트레이트 단위 실수, 오디오 누락, 4:2:2 재생 불가 등 현장에서 자주 보는 문제를 재현하고 해결하는 방법을 정리합니다.

최종 수정 2026-10-28 · 읽는 시간 약 5분 · 운영 프리즘(Prism) · 편집 원칙

이 글의 사례는 모두 직접 재현한 것입니다. 오류 메시지는 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)

#오류 조사의 기본 순서

  1. 로그 수준을 올려 처음 나온 오류를 찾습니다(-v warning 또는 -v info). 마지막 오류는 결과일 뿐 원인이 아닌 경우가 많습니다.
  2. 입력 파일을 분석합니다(3장). 대부분의 문제는 입력의 특성(VFR, 인터레이스, 손상, 비표준 코덱)에서 시작합니다.
  3. 최소 명령으로 줄입니다. 필터와 옵션을 하나씩 빼며 문제가 사라지는 지점을 찾습니다.
  4. 짧은 구간(-t 10)으로 재현해서 시도 시간을 줄입니다.
  5. 해결한 뒤에는 샘플 파일과 명령을 회귀 테스트로 보관합니다.

#정리

  • 오류는 대부분 입력 파일의 특성, 컨테이너·코덱 호환, 옵션 단위 실수에서 비롯됩니다.
  • 변환 후에는 스트림 구성, 길이, 프로파일(yuv420p 등)을 검증하는 습관이 장애를 줄입니다.
  • 오류를 해결하면 샘플과 명령을 보관해 같은 문제가 재발하지 않도록 합니다.

다음 장에서는 이런 변환과 분석을 조합해서 MAM 시스템을 설계하는 방법을 다룹니다.

#참고 자료

링크는 2026-10-28에 열람이 되는 것을 확인했습니다. 규격과 도구 문서는 개정될 수 있으므로 적용하기 전에 최신 판을 확인하세요.