피드로 돌아가기
I rewrote mp3gain in Rust — 'compatible' turned out to be three different things
Dev.toDev.to
Backend

Rust 기반 mp3rgain: 3단계 호환성 계층 설계로 구현한 Lossless 오디오 정규화

I rewrote mp3gain in Rust — 'compatible' turned out to be three different things

Jesse Pinkman2026년 5월 2일6intermediate

Context

2003년 C언어로 작성된 mp3gain의 보안 취약점과 AAC 미지원 및 64비트 빌드 불가 문제를 해결하기 위한 현대적 재구현 필요성 대두. 단순 Tag 수정 방식이 아닌 Bitstream 자체를 수정하여 Tag를 무시하는 하드웨어에서도 일관된 볼륨을 제공하는 구조적 제약 조건 존재.

Technical Solution

  • Byte-identical Output 설계를 통한 Bit-for-bit 일치 구현 및 SHA-256 기반 CI 검증으로 Drop-in Replacement 신뢰성 확보
  • APEv2 Tag의 동일 필드 및 문자열 포맷 유지로 mp3gain과의 상호 Undo 가능성을 보장하는 Metadata interoperability 구축
  • 기존 파이프라인 및 Regex 파싱 스크립트 파손 방지를 위해 기존 탭 구분 표(Tab-separated table) 형식을 유지하는 Text protocol 계층 분리
  • Memory Safety 확보를 위해 Rust 언어를 채택하여 C 기반의 Heap overflow 및 CVE 취약점 원천 제거
  • AAC Global_gain 필드의 In-place rewrite 및 MP4 Freeform metadata atoms 활용으로 AAC 파일의 Lossless 볼륨 조정 기능 확장
  • Musl-static binary 기반의 2MB Scratch 이미지 설계를 통한 배포 복잡도 제거 및 런타임 의존성 최소화

레거시 교체 시 체크리스트:

1. Bit-for-bit 동일 출력이 필요한가?

2. 외부 스크립트가 의존하는 텍스트 출력 형식이 있는가?

3. 메타데이터의 상호 호환성(Undo 등)이 보장되는가?

4. 정적 바이너리 배포로 인프라 의존성을 제거했는가?

원문 읽기