FFmpeg 오류 읽는 순서 — -i·-map·코덱·덮어쓰기 충돌 해결

FFmpeg 오류는 마지막 한 줄만 보면 코덱 문제처럼 보이지만, 실제로는 입력 경로, 옵션 순서, 스트림 선택, 출력 컨테이너 중 한 곳에서 시작되는 경우가 많습니다. 명령을 더 길게 만들기 전에 입력과 출력을 하나씩 줄여 문제를 고립하세요.

기준 명령으로 시작하기

ffmpeg -hide_banner -i "input.mp4"

출력 파일을 지정하지 않고 입력 정보만 읽습니다. 여기서 입력이 열리지 않으면 코덱 옵션을 추가해도 해결되지 않습니다. 경로, 확장자, 권한, 파일 손상을 먼저 확인하세요.

옵션은 다음 파일에 적용된다

공식 문서에 따르면 비전역 옵션을 제외한 대부분의 옵션은 뒤에 나오는 입력 또는 출력에 적용되고, 다음 파일에서 초기화됩니다. 입력 옵션과 출력 옵션을 섞어 배치하면 예상하지 못한 대상에 적용됩니다.

목적배치 원칙확인
입력 형식·프레임레이트해당 -i 앞원시 입력일 때만 필요한지
출력 코덱·비트레이트해당 출력 파일 앞다른 출력으로 설정이 넘어가지 않는지
전체 로그·오버라이트글로벌 옵션 위치자동화에서 질문 대기가 생기지 않는지

-map이 필요한 상황

자동 스트림 선택은 출력 형식이 받을 수 있는 비디오·오디오·자막 중 일부를 규칙에 따라 고릅니다. 여러 언어 오디오, 주석 트랙, 강제 자막, 첨부 파일이 있다면 자동 선택에 맡기지 말고 -map으로 의도를 표시하세요.

ffmpeg -i "input.mkv" -map 0:v:0 -map 0:a:0 -c:v copy -c:a copy "output.mkv"

이 예시는 첫 입력의 첫 비디오와 첫 오디오를 선택하고, 디코딩·재인코딩 없이 패킷을 복사하는 의미입니다. 출력 컨테이너가 해당 스트림을 받을 수 있는지는 별도로 확인해야 합니다.

streamcopy와 재인코딩

-c copy는 디코딩하지 않아 빠르고 화질 손실이 없지만, 필터를 적용할 수 없고 목표 컨테이너와 스트림 조합이 호환되어야 합니다. 크기 변경, 자막 번인, 오디오 믹싱이 필요하면 해당 스트림은 재인코딩해야 합니다. 필터를 추가하고 -c copy를 그대로 두면 서로 모순되는 설정이 됩니다.

출력 파일 덮어쓰기

수동 실행에서 기존 파일을 덮어쓸지 묻는 것은 안전 장치입니다. 자동화에서 -y를 쓰면 확인 없이 덮어쓰고, -n은 기존 파일이 있으면 중단합니다. 초기 검증은 -n과 별도 출력 폴더를 쓰는 편이 안전합니다.

로그를 읽는 순서

  1. 첫 입력의 형식과 스트림 목록이 보이는지 확인합니다.
  2. Stream mapping 부분에서 의도한 입력→출력 연결이 맞는지 봅니다.
  3. 선택된 encoder/muxer가 실제 빌드에 포함됐는지 봅니다.
  4. 마지막 오류 전 20~30줄에서 처음 나타난 구체적 실패를 찾습니다.
  5. 기준 명령에 옵션을 하나씩 복구합니다.

공식 출처

GUI 인코더와 비교하려면 HandBrake 화질·용량·자막 싱크 가이드를 함께 보세요.

최소 재현 명령을 만드는 순서

  1. 입력 파일을 하나로 줄이고 경로를 따옴표로 감쌉니다.
  2. -hide_banner -i input로 스트림 정보를 확인합니다.
  3. 출력을 다른 파일명으로 지정하고 필터를 제거합니다.
  4. 먼저 필요한 비디오·오디오 하나씩만 -map으로 선택합니다.
  5. streamcopy가 되는지 확인한 후 변환이 필요한 스트림만 재인코딩합니다.
  6. 마지막에 필터, 메타데이터, 자막, 복수 출력을 하나씩 복구합니다.

자동화에서 반드시 남길 기록

FFmpeg 버전과 빌드 옵션, 전체 명령, 입력 스트림 목록, 출력 파일 크기, 프로세스 종료 코드를 남기세요. 로그에 포함된 사용자 파일 경로와 메타데이터는 공유 전에 가리되, 오류 직전 문맥을 지우지 마세요.

명령이 성공했더라도 출력 재생 여부, 비디오·오디오 길이, 자막 스트림, 프레임레이트, 색상 정보를 점검하세요. 종료 코드 0은 명령 처리가 끝났다는 의미이지, 납품 요구 사항을 모두 만족했다는 뜻은 아닙니다.