촬영 중 갑작스럽게 중단된 영상, 전송 오류로 깨진 파일, 저장 장치 문제로 손상된 소중한 기록물—이러한 상황에 처했다면 UnTrunc가 해결책이 될 수 있다. FFmpeg 기반으로 동작하는 이 오소스 유틸리티는 정상 참조 파일의 메타데이터 구조를 분석하여 손상된 MP4/MOV 컨테이너를 재구성한다.
UnTrunc의 기술적 특성
- 스트리밍 처리 아키텍처: 파일 전체를 메모리에 로드하지 않고 청크 단위로 처리
- 대용량 지원: 4GB 이상의 고해상도 영상도 안정적 처리
- 하드웨어 특화 최적화: GoPro HERO 시리즈, DJI 드론, Sony α 카메라 등의 고유 atom 구조 인식
- 멀티 코어 활용: 병렬 디코딩으로 처리 속도 향상
사전 준비사항
| 항목 | 요구사항 | 참고 |
|---|---|---|
| 대상 파일 | 손상된 MP4/MOV/M4V | 헤더 손상 가능, 데이터 영역 존재 필요 |
| 참조 파일 | 동일 기기·동일 설정 촬영 | 해상도, 코덱, 프레임레이트 일치 필수 |
| 환경 | FFmpeg 4.0+ 또는 정적 빌드 | libavformat-dev, libavcodec-dev |
설치 및 빌드 방법
Ubuntu/Debian: 패키지 의존성 설치
sudo apt update && sudo apt install -y \
build-essential \
libavformat-dev \
libavcodec-dev \
libavutil-dev \
libswresample-dev \
git
git clone https://github.com/anthwlock/untrunc.git
cd untrunc
make -j$(nproc)
sudo install -m 755 untrunc /usr/local/bin/
macOS: Homebrew 활용
brew install ffmpeg
git clone https://github.com/anthwlock/untrunc.git
cd untrunc && make && make install
Windows: MSYS2 환경
pacman -S mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-gcc make
git clone https://github.com/anthwlock/untrunc.git
cd untrunc && make
복구 실행 프로세스
기본 명령 구조
untrunc [옵션] <참조_영상.mp4> <손상_영상.mp4>
실전 적용 예시
# 진단 모드로 구조 분석
untrunc -v -i gopro_ref_4k.mp4 corrupted_gopro.mp4
# 출력 파일명 지정
untrunc -o recovered_output.mp4 sony_a7siii_ref.mov damaged_clip.mov
# 특정 샘플 범위만 복구 (디버깅용)
untrunc -s 0 -e 1000 reference.mp4 truncated.mp4
옵션 플래그 상세
-v | verbose 모드: atom 구조 상세 출력 |
-i | 정보 모드: 복구 없이 메타데이터만 분석 |
-o | 출력 경로 지정 (기본값: 원본명_fixed.mp4) |
-s/-e | 시작/종료 샘플 번호 지정 |
-m | 메모리 매핑 모드 (초대용량 파일용) |
고급 활용 기법
배치 처리 스크립트
#!/bin/bash
REF="reference_gh5.mp4"
OUTPUT_DIR="./recovered_$(date +%Y%m%d)"
mkdir -p "$OUTPUT_DIR"
for damaged in ./corrupted/*.MP4; do
base=$(basename "$damaged" .MP4)
echo "Processing: $base"
untrunc -v -o "$OUTPUT_DIR/${base}_fixed.mp4" \
"$REF" "$damaged" 2> "$OUTPUT_DIR/${base}.log"
if [ $? -eq 0 ]; then
echo "✓ Success: $base"
else
echo "✗ Failed: $base (check log)"
fi
done
Docker 컨테이너화 실행
# Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
libavformat-dev libavcodec-dev libavutil-dev \
build-essential git && \
git clone https://github.com/anthwlock/untrunc.git /opt/untrunc && \
cd /opt/untrunc && make && make install
WORKDIR /workspace
ENTRYPOINT ["untrunc"]
# 빌드 및 실행
docker build -t video-recovery .
docker run --rm -v $(pwd):/workspace video-recovery \
/workspace/ref.mp4 /workspace/damaged.mp4
문제 해결 매트릭스
| 증상 | 원인 분석 | 해결 방안 |
|---|---|---|
moov atom not found |
참조 파일 헤더 손상 또는 형식 불일치 | 다른 참조 파일 사용, ffmpeg -i ref.mp4 -c copy repaired_ref.mp4로 재포맷 |
Failed to parse atoms |
손상 파일의 데이터 영역이 심각하게 파괴 | dd로 원시 데이터 추출 후 시도, 또는 전문 복구 서비스 이용 |
| 복구 후 화면 깨짐/색상 왜곡 | 코덱 특수 파라미터 불일치 | 정확히 동일 기기·동일 해상도·동일 프레임레이트의 참조 파일 확보 |
| 메모리 할당 실패 | 32비트 환경 또는 메모리 제한 | 64비트 빌드 확인, -m 플래그로 메모리 매핑 모드 활성화 |
| 오디오 싱크 불일치 | 타임스케일 또는 샘플 카운트 오차 | ffmpeg -itsoffset로 후처리 보정 |
내부 동작 메커니즘
UnTrunc의 핵심 알고리즘은 다음 단계로 구성된다:
- 참조 파일 파싱:
ftyp,moov,trak,mdatatom 계층 구조 추출 - 코덱 컨텍스트 생성:
avcodec에서 비디오/오디오 스트림 파라미터 획득 - 손상 파일 스캔:
mdat영역에서 유효한 NAL 유닛 또는 오디오 프레임 패턴 탐색 - 샘플 테이블 재구성:
stsz,stco,stts박스 재계산 - 컨테이너 재조립: 수정된
moov+ 복구된mdat로 새 파일 생성
성능 최적화 팁
- NVMe SSD 활용: 임시 파일 I/O 병목 제거
- 참조 파일 경량화: 10초 분량의 짧은 클립으로도 충분 (전체 파일 불필요)
- 병렬 처리: 여러 손상 파일에 대해 GNU parallel 활용
- FFmpeg 사전 검증:
ffprobe -v error ref.mp4로 참조 파일 무결성 확인
대안 도구 비교
| 도구 | 장점 | 단점 | 적합한 상황 |
|---|---|---|---|
| UnTrunc | 오픈소스, 경량, 코맨드라인 | GUI 없음, 기술 지식 필요 | 치 처리, 자동화 파이프라인 |
| MP4Repair | 상용, GUI 제공 | 유료, 클로즈드 소스 | 단일 파일, 빠른 결과 필요 |
| Grau GmbH | 온라인 서비스, 설치 불필요 | 파일 크기 제한, 프라이버시 우려 | 민감하지 않은 소형 파일 |
| ffmpeg -err_detect | 기본 탑재, 추가 설치 없음 | 복구 능력 제한적 | 경미한 손상, 긴급 대응 |
데이터 보존 권장사항
복구 작업 전 반드시 원본 파일의 바이트단위 백업을 생성할 것:
# 원본 보존용 이미지 생성
dd if=/dev/sdX of=damaged_disk_backup.img bs=4M status=progress
# 또는 파일 레벨 복사
cp -a damaged.mp4 damaged.mp4.backup
chattr +i damaged.mp4.backup # 변경 불가 속성 설정 (Linux)
복구된 파일의 무결성은 ffmpeg -v error -i recovered.mp4 -f null - 명령으로 프레임 단위 검증할 수 있다.