Ogg 컨테이너 검사기
Ogg는 코덱이 아니라 컨테이너입니다. 파일 전체가 페이지의 연속이고, 각 페이지는 어떤 논리 스트림의 조각을 실어 나릅니다. 이 도구는 모든 페이지를 훑으면서 27바이트 헤더가 실제로 담고 있는 것을 보여줍니다. OggS 캡처 패턴, 버전, 스트림 시작·끝과 이전 페이지에서 이어진 패킷을 표시하는 헤더 타입 플래그, 64비트 그래뉼 위치, 페이지가 속한 스트림의 시리얼 번호, 페이지 시퀀스 번호, 그리고 CRC32입니다. CRC는 체크섬 필드를 0으로 둔 채 페이지 전체에 대해 다시 계산합니다. zlib의 반사된 CRC-32가 아니라 Ogg가 규정한 비반사 다항식 0x04C11DB7을 쓰며, 저장된 값과 계산한 값을 나란히 보여줍니다. 세그먼트 테이블은 다른 도구가 보여주지 않는 부분입니다. 최대 255개의 레이싱 값이 페이지가 패킷으로 어떻게 나뉘는지를 말해 주는데, 정확히 255인 값은 패킷을 끝내지 않고 다음 세그먼트로, 페이지의 마지막 값이라면 다음 페이지로 이어진다는 뜻입니다. 커버 아트를 담은 코멘트 헤더가 수십 페이지에 걸쳐 실리고 그 페이지들의 그래뉼 위치가 -1인 이유가 바로 이것입니다. 그다음 페이지들을 시리얼 번호로 묶어 논리 스트림으로 만들고 각 스트림 앞의 식별 헤더를 해석합니다. Vorbis, Opus, Ogg FLAC, Theora, Speex를 인식하며 코멘트 헤더는 중복 키를 그대로 둔 멀티맵으로 읽습니다. 그리고 플레이어가 알려 주지 않는 두 가지에 답합니다. 스트림들이 서로 엇갈려 다중화되어 있는지 아니면 앞뒤로 이어 붙인 체인인지, 그리고 모든 스트림에 시작 페이지와 끝 페이지가 다 있는지입니다. 중간에 끊긴 다운로드는 끝 페이지가 없는데도 재생은 되고 길이만 틀리게 보고합니다.
사용법
- .ogg, .oga, .ogv, .opus, .spx 파일을 상자에 놓으세요. 길이가 마지막 페이지의 그래뉼 위치에 들어 있기 때문에 파일 전체를 읽습니다.
- 먼저 컨테이너 타일을 보세요. 논리 스트림이 몇 개인지, 다중화인지 체인인지, 모든 페이지 CRC가 맞는지 알 수 있습니다.
- 스트림별 블록에서 코덱 세부 정보를 확인하세요. Vorbis의 채널과 레이트, Opus의 프리스킵과 채널 매핑, Ogg FLAC의 비트 심도와 전체 샘플 수, 그리고 벤더 문자열과 파일 순서 그대로의 코멘트 필드가 있습니다.
- 페이지 표에서 플래그를 훑어보세요. 스트림 첫 페이지의 BOS, 마지막 페이지의 EOS, 패킷 중간에서 시작하는 페이지의 연속 표시입니다.
- 경고를 확인하세요. 끝 페이지 누락, CRC 불일치, 시퀀스 번호의 빈틈은 각각 파일이 손상된 구체적인 방식을 가리킵니다.
자주 묻는 질문
- Opus 스트림에서 어떤 줄은 16kHz, 다른 줄은 48kHz라고 나옵니다. 왜 그런가요?
- 서로 다른 값이기 때문입니다. OpusHead의 입력 샘플레이트는 기록용입니다. 인코더에 무엇을 넣었는지를 남겨 두어 디코더가 원한다면 되돌릴 수 있게 할 뿐입니다. Opus 자체의 내부 레이트는 48kHz 하나뿐이고 그래뉼 위치도 그 단위로 셉니다. 그래서 16kHz로 녹음한 1초짜리 파일도 마지막 그래뉼은 16000이 아니라 약 48312입니다. 입력 레이트를 재생 레이트로 읽는 것이 Opus에서 가장 흔한 실수이며, 계산한 길이가 두 값의 비율만큼 틀어집니다.
- 그래뉼 위치란 무엇이고 왜 어떤 페이지는 -1인가요?
- 그래뉼 위치는 각 페이지 끝에 적히는 코덱 자신의 시계입니다. Vorbis와 FLAC에서는 그 페이지로 디코딩할 수 있는 마지막 샘플 번호이고, Opus에서는 프리스킵을 포함한 48kHz 샘플 수이며, Theora에서는 키프레임 번호와 그로부터의 오프셋을 묶어 넣은 값입니다. 페이지에서 끝나는 패킷이 하나도 없으면 64비트가 모두 1인 -1이 됩니다. 패킷이 페이지를 넘어갈 만큼 클 때 일어나는 일이며 손상이 아니라 유일하게 정직한 값입니다.
- 이 파일이 체인이라고 나옵니다. 무슨 뜻인가요?
- 체인 파일은 완결된 Ogg 스트림 둘 이상이 앞뒤로 이어진 것입니다. 각각 자기 시리얼 번호, 자기 헤더, 자기 시작·끝 페이지를 갖습니다. cat a.ogg b.ogg의 결과가 바로 이것이고 규격도 허용합니다. 다만 규격이 플레이어들의 동작까지 통일해 주지는 않습니다. 전체를 재생하는 것도 있고, 첫 구간만 재생하고 멈추는 것도 있고, 전체를 재생하면서 길이는 첫 구간만 보고하는 것도 있습니다. 하나의 연속 파일이 필요하다면 이어 붙이지 말고 다시 인코딩하세요.
- 한 페이지가 CRC 검사에 실패합니다. 파일이 망가진 건가요?
- 페이지가 기록된 뒤 무언가 바뀐 것은 맞지만 반드시 오디오는 아닙니다. Ogg의 CRC는 헤더를 포함한 페이지 전체를 덮기 때문에, 체크섬을 다시 계산하지 않고 바이트만 고친 태그 편집기가 정확히 이 흔적을 남깁니다. 저장 장치의 비트 반전이나 끊겼다 이어받은 다운로드도 마찬가지입니다. 이 CRC는 zlib의 CRC-32가 아닙니다. Ogg는 입출력 반사도 최종 반전도 없는 다항식 0x04C11DB7을 체크섬 필드를 0으로 둔 채 계산합니다. 흔한 라이브러리 함수를 그대로 쓴 도구가 모든 페이지를 불량으로 보고하는 이유입니다.
- 패킷 하나가 왜 서른 페이지에 걸쳐 있나요?
- 한 페이지는 최대 255개의 세그먼트를 담고 각 세그먼트는 최대 255바이트이므로 65025바이트가 상한입니다. 커버 아트를 품은 코멘트 헤더는 이 값을 쉽게 넘습니다. 세그먼트 테이블은 페이지를 레이싱 값 255로 끝내는 방식으로 넘침을 표현하고, 이는 아직 끝나지 않았다는 뜻입니다. 다음 페이지는 연속 플래그를 세우고 이어서 받습니다. 아무 페이지 경계에서나 Ogg 파일을 잘라도 양쪽이 멀쩡할 거라 기대할 수 없는 이유이기도 합니다.
- 여기 표시된 길이가 플레이어와 다릅니다. 어느 쪽이 맞나요?
- 먼저 스트림 끝 플래그를 보세요. 이 페이지는 찾을 수 있는 마지막 페이지의 그래뉼 위치에서 Opus라면 프리스킵을 뺀 값으로 길이를 계산합니다. 끝 페이지가 없다면 파일이 잘린 것이고 어느 숫자도 큰 의미가 없습니다. 플레이어는 대신 비트레이트로 추정하고 있을 수 있습니다. 체인 파일에서는 여기서 길이를 합산하지만 많은 플레이어는 첫 구간만 보고합니다. Opus에서 프리스킵을 빼지 않으면 모든 파일이 약 6.5밀리초 길게 나옵니다.
관련 도구
FLAC 메타데이터 검사기
.flac 파일을 브라우저에서 열어 STREAMINFO, 모든 메타데이터 블록과 오프셋, 반복되는 Vorbis 주석, 삽입된 이미지, 실제 압축률을 확인합니다.
gzip(.gz) 구조 분석기
.gz 헤더를 필드 단위로 읽고 모든 멤버를 훑은 뒤, 브라우저에서 CRC32와 실제 크기를 다시 계산해 트레일러를 검증합니다.
SQLite 데이터베이스 검사기
.sqlite·.db 파일을 브라우저에서 열어 구조를 봅니다. 페이지 크기, 인코딩, 저널 모드, 테이블별 실제 행 수까지.
Mbox 보관 파일 뷰어
mbox 보관 파일을 브라우저에서 분할합니다. 메시지 경계와 디코딩된 헤더, MIME 구조, 스레드, 중복 Message-ID를 보여 주며 업로드는 없습니다.
MP4 / ISO 베이스 미디어 파일 분석기
MP4·M4A·M4V·MOV를 브라우저에서 분석합니다. 브랜드, 패스트 스타트 여부, 박스 트리, 트랙별 코덱과 길이, iTunes 태그를 보여 줍니다.
Mach-O 바이너리 검사기
macOS·iOS 바이너리를 브라우저에서 확인하세요. 유니버설 파일의 아키텍처, 세그먼트와 섹션, 연결된 dylib, rpath, UUID, 코드 서명까지.