Ogg コンテナインスペクター
Ogg はコーデックではなくコンテナです。ファイル全体がページの連なりで、各ページはどれかの論理ストリームの断片を運びます。このツールはすべてのページを歩き、27 バイトのヘッダーが実際に何を持っているかを示します。OggS キャプチャパターン、バージョン、ストリームの開始・終了と前ページから継続するパケットを示すヘッダータイプフラグ、64 ビットのグラニュール位置、そのページが属するストリームのシリアル番号、ページシーケンス番号、そして CRC32 です。CRC はチェックサム欄をゼロにした状態でページ全体に対して再計算します。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 ストリームで、ある行は 16 kHz、別の行は 48 kHz と出ます。なぜですか。
- 別のものだからです。OpusHead の入力サンプルレートは記録用で、エンコーダーに何を入れたかを残しているだけです。Opus 自体の内部レートは 48 kHz ひとつで、グラニュール位置もその単位で数えます。したがって 16 kHz で録った 1 秒のファイルでも最後のグラニュールは 16000 ではなく約 48312 になります。入力レートを再生レートとして読むのが Opus で最も多い間違いで、計算した長さが両者の比だけずれます。
- グラニュール位置とは何ですか。-1 のページがあるのはなぜですか。
- グラニュール位置は各ページ末尾に書かれるコーデック自身の時計です。Vorbis と FLAC ではそのページからデコードできる最後のサンプル番号、Opus ではプリスキップを含む 48 kHz サンプル数、Theora ではキーフレーム番号とそこからのオフセットを詰めた値です。そのページで終わるパケットがひとつも無ければ 64 ビットすべてが 1 の -1 になります。パケットがページをまたぐほど大きいときに起きることで、破損ではなく唯一正直な値です。
- このファイルはチェーンだと表示されました。どういう意味ですか。
- チェーンとは完結した Ogg ストリームが二つ以上、前後に連なったものです。それぞれが自分のシリアル番号、自分のヘッダー、自分の開始・終了ページを持ちます。cat a.ogg b.ogg の結果そのもので、仕様も認めています。ただし仕様はプレーヤーの挙動までは揃えてくれません。全体を再生するもの、最初の区間だけで止まるもの、全体を再生しながら長さは最初の区間しか報告しないものがあります。ひとつながりのファイルが欲しいなら、連結ではなく再エンコードしてください。
- 1 ページが CRC 照合に失敗します。ファイルは壊れていますか。
- ページが書かれたあとに何かが変わったのは確かですが、必ずしも音声とは限りません。Ogg の CRC はヘッダーを含むページ全体を覆うため、チェックサムを再計算せずにバイトだけ書き換えたタグエディターがまさにこの痕跡を残します。ストレージのビット反転や、途中で切れて再開したダウンロードも同じです。なおこれは zlib の CRC-32 ではありません。Ogg は入出力の反転も最終反転もない多項式 0x04C11DB7 を、チェックサム欄をゼロにして計算します。よくあるライブラリ関数をそのまま使ったツールが全ページを不良と報告するのはこのためです。
- ひとつのパケットが 30 ページに分かれているのはなぜですか。
- 1 ページはセグメント 255 個まで、各セグメントは 255 バイトまでなので上限は 65 025 バイトで、カバーアートを含むコメントヘッダーは簡単にこれを超えます。セグメントテーブルはページをレーシング値 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、コード署名を表示します。