FLAC 메타데이터 검사기
FLAC 파일은 네 바이트의 표식 뒤에 메타데이터 블록이 사슬처럼 이어지고 그다음에 오디오 프레임이 오는 구조입니다. 각 블록 헤더는 4바이트로 마지막 블록 플래그, 블록 종류, 24비트 길이를 담습니다. 이 페이지는 그 사슬을 그대로 따라가며 어떤 블록이 어떤 순서로, 어느 오프셋에 몇 바이트 있는지, 어느 것이 마지막으로 표시되었는지, 그래서 오디오가 정확히 어디서 시작하는지를 보여 줍니다. STREAMINFO에서 샘플레이트, 채널 수, 비트 심도, 전체 샘플 수를 읽으므로 재생 시간은 비트레이트로 추정한 값이 아니라 정확한 값이며, 메타데이터 뒤의 바이트 수를 그 값들이 의미하는 무압축 PCM 크기와 비교해 이 파일의 실제 압축률을 계산합니다. 전체 샘플 수가 0인 것도 규격상 정상이며, 인코더가 스트리밍 중이어서 길이를 몰랐다는 뜻입니다. VORBIS_COMMENT는 대부분의 태그 도구가 틀리는 부분입니다. 같은 키가 여러 번 올 수 있는 다중 맵이라 ARTIST가 세 번 나올 수 있는데, 이를 평범한 사전으로 읽는 프로그램은 하나만 남기고 나머지를 말없이 버립니다. 여기서는 모든 줄을 파일 순서대로 보여 주고 반복되는 이름을 표시합니다. PICTURE 블록이 선언한 가로·세로·색 심도·색 수는 아무도 강제하지 않으므로, 삽입된 이미지를 브라우저에서 실제로 디코딩해 선언값 옆에 실제 크기를 나란히 보여 줍니다. SEEKTABLE은 포인트 수와 자리표시자 수, 그 구간을, CUESHEET은 카탈로그 번호와 리드인, 트랙을, APPLICATION은 등록 ID를, PADDING은 낭비되는 바이트 수를 요약합니다. 앞에 붙은 ID3v2 태그는 규격에 없지만 흔하며 fLaC 표식을 0번 오프셋에서 밀어냅니다. 이 도구는 그것을 오류로 취급하지 않고 찾아내어 알려 줍니다. 다만 오디오가 제대로 디코딩되는지는 알 수 없습니다. STREAMINFO의 MD5는 디코딩된 PCM의 값이라 무손실 왕복을 증명할 뿐 디스크의 바이트를 보장하지 않으며, 그것을 확인하려면 스트림 전체를 디코딩해야 합니다.
사용법
- .flac 파일을 상자에 놓으세요. 파일 앞부분만 읽기 때문에 긴 앨범 트랙도 짧은 파일만큼 빠르게 열립니다.
- 먼저 스트림 타일을 보세요. 샘플레이트, 비트 심도, 채널은 STREAMINFO에서 나오며 전체 샘플 수가 저장되어 있어 재생 시간이 정확합니다.
- 압축률을 옆의 무압축 PCM 크기와 비교하세요. 이 파일에서 실제로 줄어든 양이며, 압축률이 나쁘다면 대개 인코더보다 마스터링 탓입니다.
- 블록 표에서 파일 구조를 확인하세요. 어떤 블록이 있고 각각 어디서 시작하며 무엇이 마지막인지, 오디오 프레임이 어느 오프셋에서 시작하는지 알 수 있습니다.
- 주석 목록에서 중복 표시가 붙은 필드를 살펴보세요. 값이 둘 이상인 필드이며 태그 편집기가 가장 자주 하나로 합쳐 버리는 항목입니다.
자주 묻는 질문
- 같은 태그가 두 번 보입니다. 오류인가요?
- 아닙니다. 값을 여러 개 담는 정상적인 방식입니다. Vorbis 주석 블록은 사전이 아니라 NAME=value 줄의 목록이라, 협업 음원에서 ARTIST가 세 번, 장르가 걸친 음반에서 GENRE가 두 번 나올 수 있습니다. 필드 이름은 대소문자를 구분하지 않아 artist와 ARTIST는 같은 필드이고, 줄의 순서는 인코더가 쓴 순서 그대로입니다. 이 블록을 평범한 맵으로 읽는 프로그램은 이름마다 값 하나만 남기고 나머지를 조용히 버리기 때문에, 아티스트 세 명으로 태그한 트랙이 잘못된 편집기를 한 번 거치면 한 명만 남습니다. 이 페이지는 모든 줄을 파일 순서대로 보여 주고 두 번 이상 나오는 이름을 표시합니다.
- STREAMINFO의 MD5는 무엇이며 파일이 멀쩡하다는 증거인가요?
- 그 값은 파일이 아니라 디코딩된 오디오, 즉 디코더에서 나온 그대로의 부호 있는 리틀엔디언 인터리브 샘플의 MD5입니다. 그래서 쓸모가 있습니다. 같은 오디오를 다른 압축 레벨로 다시 인코딩하면 파일의 모든 바이트가 달라지지만 이 MD5는 그대로이므로, 변환이 무손실이었음을 증명할 수 있습니다. 반대로 파일만 봐서는 확인할 수 없다는 뜻이기도 합니다. 스트림 전체를 디코딩해 해시해야 하며 flac -t가 바로 그 일을 합니다. 일부 인코더는 이 필드를 0 열여섯 바이트로 남기는데, 이는 검증 실패가 아니라 서명을 저장하지 않았다는 뜻입니다.
- 재생 시간이 알 수 없음이고 전체 샘플 수가 0입니다. 깨진 파일인가요?
- 깨진 것이 아니라 스트림입니다. STREAMINFO의 샘플 수는 입력 길이를 다 안 뒤 마지막에 기록되는데, 파이프나 실시간 스트림으로 쓰는 인코더는 되돌아가 채울 수 없어 0을 남깁니다. 규격이 명시적으로 허용하는 값입니다. 재생기는 프레임이 끝날 때까지 디코딩하는 식으로 처리하며, 재생하는 동안 시간이 늘어나는 것처럼 보이기도 합니다. 샘플레이트, 채널, 비트 심도, MD5 등 나머지는 모두 유효하고 재생도 정상입니다. 디코딩해서 실제 파일로 다시 인코딩하면 그 숫자가 채워집니다.
- FLAC 파일이 왜 ID3 태그로 시작하나요?
- 주로 MP3를 다루는 도구가 붙였기 때문입니다. FLAC의 태그는 VORBIS_COMMENT 블록에 있고 규격에는 ID3 자리가 없지만, ID3v2는 파일 맨 앞에 오도록 설계되어 있어 일부 리퍼나 재생기, 휴대폰 앱이 그대로 붙입니다. 대부분의 디코더는 건너뛰지만 일부는 fLaC가 0번 오프셋에 없다는 이유로 파일을 거부합니다. 이 페이지는 그 태그를 찾아 몇 바이트인지 알려 주고 표식이 실제로 시작하는 곳부터 진짜 메타데이터를 읽습니다. 그 ID3 안에 쓴 내용은 FLAC를 아는 소프트웨어에게는 보이지 않으므로, 같은 파일이 여기서와 다른 곳에서 다른 제목으로 보일 수 있습니다.
- FLAC의 압축률은 보통 얼마인가요?
- 대부분의 음악은 무압축 PCM의 50~70% 정도이며, 여기 표시되는 값도 정확히 그 정의로 계산합니다. 마지막 메타데이터 블록 이후의 바이트를 전체 샘플 수 × 채널 × 비트 심도 ÷ 8로 나눈 값입니다. 조용하거나 성긴 소리는 훨씬 잘 줄고, 크고 리미팅이 심한 마스터는 잘 줄지 않으며, 잡음에 가까운 소리는 거의 줄지 않습니다. 인코더 설정(-0~-8)은 인코딩 시간과 크기를 몇 퍼센트 움직일 뿐 음질은 바꾸지 않습니다. 모든 레벨이 무손실이기 때문입니다. 24비트 마스터가 16비트보다 압축률이 나쁜 것도 정상인데, 하위 비트가 난수에 가까워 예측할 것이 없기 때문입니다.
- 파일이 업로드되나요? 오디오를 검증할 수 있나요?
- 둘 다 아닙니다. 파일은 브라우저의 File API로 열려 페이지 안에서 해석되며, 메타데이터가 앞쪽에 있으므로 파일 앞부분만 읽고 뒤의 프레임은 크기만 잽니다. 어디로도 전송되지 않고 보낼 서버도 없습니다. 뒷부분도 똑같이 중요합니다. 여기 있는 어떤 값도 오디오 자체에 대한 보증이 아닙니다. 블록 길이와 태그, 그림은 메타데이터에서 읽고 프레임은 디코딩하지 않으며 저장된 MD5도 그대로 옮겨 적을 뿐 검증하지 않습니다. 그래서 메타데이터가 완벽하고 오디오가 손상된 파일도 이 페이지에서는 멀쩡해 보입니다. 그것을 잡아내는 것은 디코딩입니다.
관련 도구
WAV 파일 인스펙터
.wav 파일 드롭 → 포맷·채널·샘플레이트·비트 깊이·길이·모든 RIFF 청크·내장 LIST/INFO 태그 표시. 완전 클라이언트 사이드.
Ogg 컨테이너 검사기
.ogg, .oga, .opus를 페이지 단위로 분석합니다. 그래뉼 위치, 세그먼트 테이블, CRC32 검증, 그리고 컨테이너가 담은 논리 스트림까지 보여줍니다.
MP3 태그(ID3) 뷰어 · 앨범아트 추출
MP3를 끌어다 놓으면 ID3 태그, 비트레이트, 재생 시간을 읽고 내장된 앨범 아트까지 꺼내줍니다. 전부 브라우저에서요.
PNG 청크 인스펙터
`.png` 파일 드롭 → 포함된 모든 청크 확인 — IHDR·IDAT·tEXt 메타데이터·IEND — 크기·CRC·critical/ancillary/safe-to-copy 플래그 포함.
폰트 파일 검사기
.ttf, .otf, .woff 파일을 열어 실제 패밀리 이름, 글리프·문자 수, 버전, 라이선스 문구와 임베딩 허용 범위를 확인합니다.
이미지 → WebP / JPEG / PNG 변환
PNG/JPG ↔ WebP 변환, 품질 슬라이더 조정 — 브라우저 canvas로 처리.