AI·로컬 LLM

AI 영상 복원 검증법: 길이만 봐선 안 되는 이유 (pts, fps)

홈랩지기 2026. 8. 19. 09:50

맥미니 한 대로 AI 영상 복원 파이프라인을 돌리고 있다. 오래된 저화질 영상을 업스케일·노이즈 제거하는 작업인데, 한 편에 짧으면 두어 시간, 400분짜리 대작은 하루 가까이 걸린다.

이런 걸 수백 편 단위로 배치를 돌리다 보면 결과물이 수백 기가씩 쌓이고, 사람이 일일이 열어볼 수 없으니 검증도 자동화가 된다.

초반의 검증은 단순했다. 복원이 끝나면 원본과 결과물의 재생 길이를 비교해서 차이가 없으면 통과. 몇 주 동안 아무 문제도 없었다.

그러다 어느 날, 통과 판정을 받은 결과물 하나를 우연히 뒤쪽부터 확인해봤다. 재생바를 후반부로 끌었더니 화면이 마지막 프레임에 얼어붙은 채 소리만 계속 나왔다.

실측을 해보니 이랬다.

비디오 스트림 길이: 7,180.42초

오디오 스트림 길이: 7,423.98초

컨테이너(파일)에 찍힌 길이: 7,423.98초 — 원본과 일치

비디오가 오디오보다 243초, 그러니까 4분 넘게 먼저 끝나 있었다. 그런데도 검증은 통과였다.

왜냐면 동영상 파일(컨테이너)에 찍히는 길이는 보통 가장 긴 트랙 기준이기 때문이다. 복원 도중 비디오 스트림이 중간에 끊겼어도, 오디오 트랙이 끝까지 멀쩡하면 파일 길이는 "정상"으로 보인다.

길이만 보는 검증은 이런 불량을 구조적으로 못 잡는다.

 

첫 번째 함정: 길이가 믿을 게 못 되더라 🤦‍♀️

그날로 검증 스크립트를 갈아엎었다. 지금은 편이 끝날 때마다 ffprobe로 이렇게 본다.

ffprobe -v error -select_streams v -show_entries stream=duration 결과물.mp4

ffprobe -v error -select_streams a -show_entries stream=duration 결과물.mp4

첫째, 비디오·오디오·컨테이너 세 가지 길이를 각각 원본과 비교한다. 허용 오차는 0.001초.

둘째, 마지막 비디오 pts를 확인한다. pts는 프레임마다 찍혀 있는 "이 그림은 몇 초 시점에 보여라"라는 도장인데, 마지막 프레임의 pts와 컨테이너 끝의 간격이 0.5초를 넘으면 불합격 처리한다. 위 사례라면 간격이 243.5초로 찍히니 바로 걸린다.

셋째, 프레임 수를 원본과 대조하고, 전체 스트림을 디코드해서 에러가 0인지 확인한다.

핵심은 "마지막 비디오 pts"다. 비디오가 실제로 어디까지 존재하는지는 이 값만이 말해준다.

컨테이너 길이는 포장 상자에 적힌 숫자일 뿐, 내용물이 그만큼 들었다는 보장이 아니다.

 

이걸로 끝인 줄 알았는데 두 번째 함정이 있었다. 이번엔 길이도 pts도 전부 정상인데, 재생해 보면 소리가 점점 밀리는 파일이 나왔다.

앞부분은 멀쩡하다. 그런데 한참 지나면 입모양과 소리가 어긋나기 시작한다.

 

두 번째 함정: fps 표기를 믿지 마세요! 😵‍💫

원인은 원본 컨테이너에 적힌 fps(초당 프레임 수)가 실제와 달랐던 것. 파이프라인은 복원한 프레임을 다시 영상으로 조립할 때 이 표기값을 믿는다.

예를 들어 실제로는 30fps로 찍힌 영상인데 컨테이너에 29.97로 적혀 있으면, 재조립된 영상은 0.1% 느리게 흘러가고 오디오는 제자리다.

겨우 0.1%지만 한 시간이면 3.6초가 밀린다. 대화 장면에서 3.6초면 완전히 다른 사람이 말하고 있는 수준이다.

그리고 이 불량은 앞부분 1~2분만 확인하는 검증으로는 절대 못 잡는다.

그 뒤로는 메타데이터의 fps를 그대로 믿지 않고, 실제 프레임 수를 재생 길이로 나눠 역산한 값으로 조립한다.

 

덤으로 얻은 꿀팁: faststart는 공짜 보험이다 🤩

부수적으로 얻은 보험 하나. 결과물은 faststart(재생 정보를 파일 앞쪽에 배치) 옵션으로 저장한다.

원래 mp4는 재생 정보가 파일 끝에 붙어서, 장시간 배치 도중 파일이 잘리면 통째로 못 여는 쓰레기가 된다.

앞쪽에 두면 잘려도 앞부분까지는 재생되는 파일이 남는다. 하루짜리 작업이 날아가는 것과 절반이라도 건지는 것의 차이다.

 

그래서 정리하면 이렇다.

  • 길이 비교는 검증이 아니라 인사치레다. 비디오·오디오·컨테이너를 따로 재야 한다.
  • 비디오의 진짜 끝은 마지막 pts가 말해준다. 간격 0.5초 넘으면 불량.
  • 메타데이터의 fps는 참고사항이지 사실이 아니다. 프레임 수로 역산해서 써라.
  • faststart는 공짜 보험이다. 배치라면 무조건 켜라.

 

수백 편을 돌린 배치에서 이런 불량이 나온 건 손에 꼽을 정도다. 하지만 검증이 허술하면 그 몇 개가 몇 주 뒤에야 발견되고, 그때는 수백 편 중 어느 편이 문제인지 찾는 것부터가 고역이다.

검증 스크립트 몇 줄이 재작업 몇 시간을 막는다. 배치 자동화에서 제일 남는 장사는 언제나 검증 강화였다.

※ 이 글은 직접 겪은 작업 경험을 바탕으로 AI의 도움을 받아 작성했습니다.