目次
調べたもの
オーディオメタフォーマットであるFLACの仕様ドキュメントを日本語に翻訳しました。
xiph.org
FLACとは、Free Lossless Audio Codecの略で、MP3に似た音声フォーマットですが、Lossless(非可逆圧縮)であるため、音質の劣化がなく音声を圧縮することができます。これはZipが機能する仕組みに似ていますが、FLACは音声専用に設計されているため、はるかに優れた圧縮を実現します。さらに、圧縮されたFLACファイルを、MP3ファイルと同様にお気に入りのプレーヤーや(車や家庭用ステレオなどの対応デバイスで)再生することができます。
FLACは、最も速く、最も広くサポートされているロスレスオーディオコーデックであり、非独占的であり、特許に縛られず、オープンソースのリファレンス実装があり、フォーマットとAPIがよく文書化されており、他にもいくつかの独立した実装が存在する唯一のコーデックです。
詳しくは「About FLAC」をご覧ください。また、「Using FLAC」では、FLACファイルの再生方法や、CDをFLACにリッピングする方法などについて説明しています。
Features
FLACは、以下に対応しています。
FLACは無料で利用可能であり、Windows、unix(Linux、BSD、Solaris、OS X、IRIX)、BeOS、OS/2、およびAmigaなど、ほとんどのオペレーティングシステムでサポートされています。
FLACをサポートするプログラムやデバイスは多数あります。ここで紹介するFLACのコアプロジェクトでは、フォーマットを維持し、FLACファイルを操作するためのプログラムやライブラリを提供しています。公式のFLACツールのダウンロードとインストールの手順については「Getting FLAC」を参照してください。
FLACが「Free(フリー)」であるというとき、それは単に無料で利用できるという意味以上のものを含んでいます。FLACのフォーマット仕様は、あらゆる目的で利用できるように完全に公開されており(FLACプロジェクトはFLAC仕様を設定し、準拠性を認証する権利を留保しています)、FLACフォーマットや実装されたエンコード/デコードの方法は、既知の特許に基づくものではありません。また、すべてのソースコードはオープンソースライセンスの下で利用可能です(詳細はライセンスページを参照してください)。
FLACの主な特徴:
- ロスレス:音声(PCM)データのエンコードには情報の損失がなく、デコードされた音声はエンコーダーに入力されたものとビット単位で同一です。各フレームには伝送エラーを検出するための16ビットCRCが含まれています。音声データの整合性は、ファイルヘッダーに元の非エンコード音声データのMD5署名を格納することでさらに保証され、デコードやテスト時にこれを比較することができます。
- 高速:FLACはデコード速度を重視する非対称型であり、デコードには整数演算のみを使用し、ほとんどの知覚コーデックよりも計算負荷がはるかに少ないです。リアルタイムのデコード性能は、控えめなハードウェアでも容易に達成できます。
- ハードウェア対応:FLACは、携帯プレーヤーから家庭用ステレオ機器、車載ステレオまで、数十種類の民生用電子機器でサポートされています。
- 柔軟なメタデータ:FLACのメタデータシステムは、タグ、カバーアート、シークテーブル、キューシートに対応しています。アプリケーションはIDを登録することで独自のAPPLICATIONメタデータを書き込むことができます。新しいメタデータブロックは、古いストリームやデコーダーを壊すことなく、FLACの将来のバージョンで定義および実装することができます。
- シーク可能:FLACは高速でサンプル精度の高いシークに対応しています。これは再生に役立つだけでなく、FLACファイルを編集アプリケーションで使用するのにも適しています。
- ストリーム可能:各FLACフレームには、そのフレームをデコードするのに十分なデータが含まれています。FLACは前後のフレームに依存しません。FLACは、シンクコードとCRC(MPEGなど他のフォーマットと類似)を使用し、フレーミングとともに、ストリームの途中から最小限の遅延でデコーダーが再開できるようにします。
- アーカイブに適している:FLACはオープンフォーマットであり、将来別のフォーマットにデータを変換する必要があっても世代劣化がありません。フレームCRCやMD5署名に加えて、エンコードプロセスと並行してエンコードされたストリームをデコードし、元の音声と比較して不一致があればエラーで中止する「verify」オプションもあります。
- 便利なCDアーカイブ:FLACには、CDの目次とすべてのトラックとインデックスポイントを格納するための「キューシート」メタデータブロックがあります。たとえば、CDを1つのファイルにリッピングし、エンコード中に抽出されたキューシートをインポートして、CD全体を表す1つのファイルを作成することができます。元のCDが破損している場合は、後でキューシートをエクスポートして正確なコピーを焼くことができます。
- エラー耐性:FLACのフレーミングのおかげで、ストリームエラーは発生したフレームのダメージに限定され、通常はデータのほんのわずかの部分(1秒未満)に影響します。これに対し、他の一部のロスレスコーデックでは、1つのエラーがストリームの残りを破壊する可能性があります。
FLACではないもの:
- ロッシー:FLACはロスレス圧縮専用であり、すでにVorbis、MPC、MP3などの優れたロッシーフォーマットが多数存在します(優れたオープンソース実装であるLAMEを参照してください)。
- DRM:コピー防止方法を追加する意図はありません。もちろん、他のコンテナでFLACストリームを暗号化すること(たとえば、AppleがAACをMP4でFairPlayで暗号化する方法)は止められませんが、それはユーザーの選択です。
FLACストリームの基本構造は以下の通りです:
最初の4バイトはFLACストリームを識別するためのものです。その後に続くメタデータは、オーディオデータ自体を除くすべてのストリーム情報を含んでいます。メタデータの後にはエンコードされたオーディオデータが続きます。
FLACは、いくつかの種類のメタデータブロックを定義しています(完全なリストについてはフォーマットページを参照してください)。メタデータブロックは任意の長さにでき、新しいものも定義できます。デコーダーは理解できないメタデータの種類をスキップすることが許可されています。必須のブロックは1つだけで、それがSTREAMINFOブロックです。このブロックにはサンプルレート、チャンネル数などの情報や、デコーダーがバッファを管理するのに役立つ最小・最大データレートや最小・最大ブロックサイズなどのデータが含まれています。また、STREAMINFOブロックには、非エンコード音声データのMD5署名も含まれており、これはストリーム全体の伝送エラーをチェックするのに役立ちます。
その他のブロックでは、パディング、シークテーブル、タグ、キューシート、およびアプリケーション固有のデータを格納することができます。FLACには、PADDINGブロックを追加したり、シークポイントを指定したりするオプションがあります。シークにはシークポイントは必要ありませんが、シークの速度を上げたり、編集アプリケーションでのキューイングに使用したりできます。
また、カスタムメタデータブロックが必要な場合は、自分で定義し、IDをここでリクエストすることができます。その後、エンコード時に正しいサイズのPADDINGブロックを予約し、エンコード後にAPPLICATIONブロックでパディングブロックを上書きします。この結果得られるストリームはFLAC互換であり、あなたのメタデータを認識しているデコーダーはそれを利用し、それ以外のデコーダーは安全に無視します。
オーディオデータ
メタデータの後にエンコードされたオーディオデータが続きます。オーディオデータとメタデータはインターリーブされていません。ほとんどのオーディオコーデックと同様に、FLACは非エンコードのオーディオデータをブロックに分割し、各ブロックを個別にエンコードします。エンコードされたブロックはフレームにパックされ、ストリームに追加されます。リファレンスエンコーダーはストリーム全体に対して単一のブロックサイズを使用しますが、FLACフォーマットはこれを必須とはしていません。
ブロックサイズはエンコードにおける重要なパラメータです。サイズが小さすぎると、フレームのオーバーヘッドが圧縮率を下げてしまいます。サイズが大きすぎると、コンプレッサーのモデリングステージが効率的なモデルを生成できなくなります。FLACのモデリングを理解することで、入力の種類に応じてブロックサイズを変えることで圧縮率を向上させることができます。一般的な場合、44.1kHzオーディオに線形予測を使用する場合、最適なブロックサイズは2~6kサンプルの間になります。この場合、flacはデフォルトで4096のブロックサイズを使用します。高速固定予測子を使用する場合は、フレームヘッダーが小さいため、通常は小さいブロックサイズが好ましいです。
インターチャンネルデコリレーション
ステレオ入力の場合、データがブロック化された後、オプションでインターチャンネルデコリレーションステージを通過します。
左チャネルと右チャネルは、以下の変換によってセンターとサイドチャネルに変換されます:
mid = (left + right) / 2
side = left - right
これは、ジョイントステレオとは異なり、ロスレスなプロセスです。通常のCDオーディオでは、これにより大幅な追加圧縮が可能です。flacには、-m
オプション(ブロックの左右バージョンとミッドサイドバージョンの両方を常に圧縮し、最小のフレームを取る)と、-M
オプション(左右とミッドサイドを適応的に切り替える)の2つのオプションがあります。
次のステージでは、エンコーダーが信号を関数で近似し、その近似を差し引いた結果(残差、残留、エラーと呼ばれる)がエンコードするのに必要なビット数が少なくなるようにします。関数のパラメータも送信しなければならないため、節約を食い潰さないように複雑すぎないものである必要があります。
FLACには、近似を形成するための2つの方法があります:
1. 信号に単純な多項式をフィッティングすること
2. 一般的な線形予測符号(LPC)。ここでは詳細には触れませんが、エンコードオプションに関する一般的な内容をいくつか説明します。
まず、固定多項式予測(-l 0で指定)ははるかに高速ですが、LPCよりも精度が低くなります。LPCの最大次数が高いほど、モデルは遅くなりますが、より正確になります。ただし、次数が増えるにつれてその効果は減少します。また、通常は次数9付近でエンコーダーが使用するべき最適な次数を見誤り、圧縮率が若干低下し始めるため、その場合は、非常に遅くなりますが、完全探索オプション-e
を使用する必要があります。
次に、固定予測子のパラメータは3ビットで送信できますが、LPCモデルのパラメータはビットパーサンプルとLPC次数に依存します。これにより、使用する方法と次数に応じてフレームヘッダーの長さが変わり、最適なブロックサイズに影響を与える可能性があります。
残留符号化
モデルが生成されると、エンコーダーは近似から元の信号を引いて残差(エラー)信号を得ます。このエラー信号はロスレスで符号化されます。FLACは、このエラー信号が一般的にラプラシアン(二項)分布を持つことを利用し、これらの信号を迅速に効率よくエンコードするための辞書を必要としない特殊なハフマンコード、ライスコードと呼ばれる一連のコードを使用します。
ライス符号化は、信号の分布に一致する単一のパラメータを見つけ、そのパラメータを使用してコードを生成することを伴います。分布が変化すると、最適なパラメータも変化するため、FLACはパラメータが必要に応じて変化するメソッドをサポートしています。残差は複数のコンテキストやパーティションに分割でき、それぞれにライスパラメータが設定されます。flacは、-r
オプションを使用してパーティショニングを指定できます。残差は2^n
のパーティションに分割でき、-r n
, n
オプションを使用して指定します。n
パラメータはパーティション順序と呼ばれます。さらに、-r m
, n
オプションを指定することで、mからnまでのパーティション順序を調べ、最適なものを取るようにエンコーダーを設定できます。一般的に、nの選択はエンコード速度に影響しませんが、m,nの選択は影響します。mとnの差が大きいほど、エンコーダーが最適な順序を探すのに時間がかかります。ブロックサイズも最適な順序に影響を与えます。
オーディオフレームの前にはフレームヘッダーがあり、その後にはフレームフッターが続きます。ヘッダーは同期コードで始まり、サンプルレート、ビットパーサンプルなど、ストリームを再生するためにデコーダーが必要とする最小限の情報を含んでいます。また、ブロック番号やサンプル番号、フレームヘッダーの8ビットCRCも含まれています。同期コード、フレームヘッダーCRC、およびブロック/サンプル番号により、シークポイントがない場合でも再同期とシークが可能です。フレームフッターには、エンコードされたフレーム全体の16ビットCRCが含まれ、エラー検出に使用されます。リファレンスデコーダーがCRCエラーを検出した場合、サイレントブロックを生成します。
その他
参考までに、リファレンスデコーダーはID3v2タグをスキップする方法を知っています。ただし、FLAC仕様では、準拠した実装にID3をサポートすることを要求していないため、その使用は強く推奨されていません。
flacには-V
オプションがあり、エンコード中に出力を検証します。このオプションでは、エンコーダーと並行してデコーダーが実行され、その出力が元の入力と比較されます。違いが見つかった場合、flacはエラーで停止します。
FLAC形式に関するさまざまな側面について、ソフトウェア開発者の視点から説明します。つまり、FLACファイル内のどのビットやバイトがどのような情報を含んでいるのか、またそれらをどのようにエンコードまたはデコードすべきかについて説明します。ユーザー向けの概要については、「FLACフォーマットについて」をご覧ください。
FLAC形式およびそのコンテナフォーマットへのマッピングに関する説明は、以下のドキュメントに分かれています:
以下に、長年このページに掲載されており、上記のリストで最初に挙げたCELLAR作業部会の草案の基礎となったFLAC形式の説明を示します。詳細に欠ける部分があり、完全に理解するためにはlibFLACのソースコードで詳細を確認する必要がありますが、有用な概要および歴史的な参考資料として役立ちます。 デコーダーがここで説明されているFLAC形式のすべての機能を正しく実装しているかどうかをテストするための、FLAC形式の適合性テストファイルのセットが利用可能です。
範囲
すべての入力を無損失で圧縮できるアルゴリズムは存在しないという事実が知られています。したがって、ほとんどの圧縮器は有用なドメインに制限し、そのドメイン内でできるだけ効率的に動作しようとします。FLACのドメインは音声データです。任意の入力を無損失でコード化できますが、特定の種類の入力のみが圧縮されます。FLACは、音声データが通常、サンプル間の相関が高いという事実を利用しています。
音声ドメイン内には多くのサブドメインが存在します。たとえば、低ビットレートの音声、高ビットレートのマルチチャネル音楽などです。FLAC自体は特定のサブドメインを対象としていませんが、リファレンスエンコーダーの多くのデフォルトパラメータは、CD品質の音楽データ(つまり44.1kHz、2チャネル、16ビット/サンプル)に調整されています。エンコードパラメータが異なる種類の音声データに与える影響については、後で説明します。
多くの音声コーダーと同様に、FLACエンコーダーには次のステージがあります:
- ブロッキング。入力が多数の連続したブロックに分割されます。FLACでは、ブロックのサイズは可変です。最適なブロックサイズは、サンプルレート、時間にわたるスペクトル特性など、多くの要因によって影響を受けます。FLACは、ストリーム内でブロックサイズが可変であることを許可していますが、リファレンスエンコーダーは固定ブロックサイズを使用します。
- チャネル間デコリレーション。ステレオストリームの場合、エンコーダーは左チャネルと右チャネルの平均値および差分に基づいてミッドおよびサイド信号を生成します。その後、エンコーダーは信号の最適な形式を次のステージに渡します。
- 予測。ブロックは予測ステージに渡され、エンコーダーは信号の数学的な説明(通常は近似)を見つけようとします。この説明は通常、元の信号自体よりもはるかに小さくなります。予測方法がエンコーダーとデコーダーの両方に既知であるため、予測子のパラメータのみを圧縮ストリームに含める必要があります。FLACは現在、4つの異なるクラスの予測子を使用していますが(予測セクションで説明)、追加の方法を追加するためのスペースが予約されています。FLACは、ブロックごとに、またはブロックのチャネル内でも予測子のクラスを変更することができます。
- 残差コーディング。予測子が信号を正確に説明しない場合、元の信号と予測信号の差分(エラーまたは残差信号と呼ばれる)を無損失でコード化する必要があります。予測子が効果的であれば、残差信号には元の信号よりもビット数が少なくて済みます。FLACは現在、残差をエンコードする方法として1つの方法しか使用していませんが(残差コーディングセクションを参照)、追加の方法を追加するためのスペースが予約されています。FLACは、ブロックごとに、またはブロックのチャネル内でも残差コーディング方法を変更することができます。
さらに、FLACにはメタデータシステムが指定されており、ストリームの開始時にストリームに関する任意の情報を含めることができます。
定義
多くのエンコーディングスキームでは、「ブロック」や「フレーム」などの用語が異なる意味で使用されています。たとえば、MP3のフレームは複数のチャンネルにわたる多数のサンプルに対応しますが、S/PDIFのフレームは各チャンネルに1つのサンプルを表します。FLACで使用される定義は以下の通りです。ブロックやサブブロックについて話すときは、エンコーダへの入力である生の未エンコードのオーディオデータを指し、フレームやサブフレームについて話すときは、FLACでエンコードされたデータを指しています。
- ブロック (Block): 複数のチャンネルにまたがる1つまたは複数のオーディオサンプル。
- サブブロック (Subblock): チャンネル内の1つまたは複数のオーディオサンプル。したがって、ブロックは各チャンネルに1つのサブブロックを含み、すべてのサブブロックは同じ数のサンプルを含んでいます。
- ブロックサイズ (Blocksize): ブロックのサブブロックの中にあるサンプルの数。たとえば、44.1KHzでサンプリングされた1秒間のブロックは、チャンネルの数に関係なくブロックサイズが44100になります。
- フレーム (Frame): フレームヘッダーと1つ以上のサブフレームで構成されるもの。
- サブフレーム (Subframe): サブフレームヘッダーと、特定のチャンネルからエンコードされた1つ以上のサンプルで構成されるもの。フレーム内のすべてのサブフレームは、同じ数のサンプルを含んでいます。
オーディオデータをブロッキングする際に使用されるサイズは、圧縮率に直接影響を与えます。ブロックサイズが小さすぎると、多くのフレームが生成されるため、フレームヘッダーに余分なビットが浪費されます。逆にブロックサイズが大きすぎると、信号の特性が大きく変動する可能性があり、エンコーダが良い予測子を見つけることができなくなります。エンコーダ/デコーダの設計を簡素化するために、FLACは最小ブロックサイズを16サンプル、最大ブロックサイズを65535サンプルに制限しています。この範囲は、FLACがサポートするすべてのオーディオデータに対して最適なサイズをカバーしています。
現在のリファレンスエンコーダは、入力のサンプルレートに基づいて最適化された固定ブロックサイズを使用しています。将来のバージョンでは、信号の特性に応じてブロックサイズを変更する可能性があります。
ブロッキングされたデータは、サブブロック(チャンネル)ごとに予測ステージに渡されます。各サブブロックは独立してサブフレームにエンコードされ、サブフレームはフレームに連結されます。各チャンネルが別々にエンコードされるため、ステレオフレームの1つのチャンネルは定数サブフレームとしてエンコードされ、もう1つのチャンネルはLPCサブフレームとしてエンコードされることもあります。
チャンネル間のデコリレーション(Interchannel-Decorrelation)
ステレオストリームでは、左チャンネルと右チャンネルの間に利用可能な相関があることがよくあります。FLACは、ステレオストリームのフレームが異なるチャンネル割り当てを持つことを許可しており、エンコーダはフレームごとに最適な表現方法を選択できます。
- 独立 (Independent): 左チャンネルと右チャンネルが独立してエンコードされます。
- ミッドサイド (Mid-side): 左チャンネルと右チャンネルがミッドチャンネルとサイドチャンネルに変換されます。ミッドチャンネルは左信号と右信号の中点(平均)であり、サイドは差分信号(左 - 右)です。
- 左サイド (Left-side): 左チャンネルとサイドチャンネルがエンコードされます。
- 右サイド (Right-side): 右チャンネルとサイドチャンネルがエンコードされます。
驚くべきことに、左サイドと右サイドの形式は、多くのフレームにおいて最も効率的である場合があります。これは、元の信号に必要なビット数が独立エンコーディングやミッドサイドエンコーディングよりもわずかに多くなるにもかかわらずです。
予測 (Prediction)
FLACは入力信号のモデリングに4つの方法を使用しています。
- 逐次エンコード (Verbatim): これは信号のゼロ次予測子です。予測された信号はゼロであり、残差は信号そのものであり、圧縮はゼロです。これは、他の予測子と比較するための基準です。エンコーダにランダムなデータを入力すると、逐次エンコードがすべてのサブブロックで使用される可能性が高いです。元の信号は実際には残差符号化ステージを通過しないため、エンコーディング結果はゼロ次の線形予測子と同じではありません。
- 定数 (Constant): この予測子は、サブブロックが純粋なDC(デジタルサイレンス)、つまり常に一定の値を持つ場合に使用されます。信号はランレングスエンコードされ、ストリームに追加されます。
- 固定線形予測子 (Fixed linear predictor): FLACは計算効率の良い固定線形予測子のクラスを使用しています(良い説明はaudiopakやShortenを参照してください)。FLACは、Shortenで使用される0次から3次の予測子に加えて、4次の予測子を追加しています。予測子は固定されているため、圧縮ストリームに保存する必要があるのは予測子の順序のみです。エラー信号はその後、残差符号化器に渡されます。
- FIR線形予測 (FIR Linear prediction): より正確なモデリングのために(エンコードが遅くなるコストがかかりますが)、FLACは最大32次のFIR線形予測をサポートしています(再び、線形予測に関する情報はaudiopakやShortenを参照してください)。リファレンスエンコーダは、Levinson-Durbin法を使用して自己相関係数からLPC係数を計算し、その係数を量子化してから残差を計算します。Shortenのようなエンコーダが入力全体に対して固定量子化を使用していたのに対し、FLACはサブフレームごとに量子化された係数の精度を変えることができます。FLACリファレンスエンコーダは、ブロックサイズと元の信号のダイナミックレンジに基づいて使用する最適な精度を推定します。
残差符号化
FLACは現在、予測ステージからのエラー信号を符号化するために、2つの類似した方法を定義しています。エラー信号はライス符号を使用して次の2つの方法のいずれかで符号化されます。
1) エンコーダは残差の分散に基づいて1つのライスパラメータを推定し、このパラメータを使用して残差全体をライス符号化します。
2) 残差は連続するサンプルのいくつかの等長の領域に分割され、各領域はその領域の残差の分散に基づいて独自のライスパラメータを持ちます。
最初の方法は、1つの分割による2つ目の方法の特別なケースであり、ライスパラメータは分散ではなく平均に基づいています。
FLACフォーマットには、他の符号化方法のための予約領域があります。ボランティアにとっての可能性としては、ライスパラメータのより良いコンテキストモデリングやハフマン符号化の探求があります。複数のユニバーサル符号の説明については、LOCO-Iやpucrunchを参照してください。
フォーマット
このセクションでは、FLACビットストリームのフォーマットを指定します。FLACにはバージョン情報はありませんが、いくつかの場所に予約スペースがあります。将来のフォーマットバージョンでは、この予約スペースを安全に使用することができ、古いストリームのフォーマットを壊すことはありません。古いデコーダは、新しい方法でエンコードされたデータのデコードを中止したり、スキップしたりすることができます。予約されたパターンとは別に、フォーマットでは無効なパターンが指定されている場所があります。これらのパターンは、以前のバージョン、現在のバージョン、および将来のバージョンのフォーマットのいずれにおいても、有効なビットストリームに現れることはありません。これらの無効なパターンは、同期メカニズムをより堅牢にするために使用されることがよくあります。
FLACビットストリームで使用されるすべての数値は整数であり、浮動小数点表現はありません。すべての数値はビッグエンディアンで符号化されます。特に指定されていない限り、すべての数値は符号なしです。
ストリームの正式な説明に入る前に、概要が役立つかもしれません。
- FLACビットストリームは、ストリームの先頭にある「fLaC」マーカー、その後に続く必須のメタデータブロック(STREAMINFOブロックと呼ばれる)、任意の数の他のメタデータブロック、そしてオーディオフレームで構成されます。
- FLACは最大128種類のメタデータブロックをサポートしており、現在以下のものが定義されています。
- STREAMINFO: このブロックには、サンプルレート、チャンネル数、総サンプル数など、ストリーム全体に関する情報が含まれています。このブロックはストリーム内の最初のメタデータブロックとして存在しなければなりません。他のメタデータブロックが続く場合があり、デコーダが理解しないブロックはスキップされます。
- APPLICATION: このブロックはサードパーティのアプリケーションで使用されるものです。唯一必須のフィールドは32ビットの識別子です。このIDは、アプリケーションがFLACメンテナによって要求された際に付与されます。残りの部分は登録されたアプリケーションによって定義されます。アプリケーションのIDをFLACに登録したい場合は、登録ページをご覧ください。
- PADDING: このブロックは任意の量のパディングを可能にします。PADDINGブロックの内容には意味がありません。このブロックは、エンコード後にメタデータが編集されることが分かっている場合に便利です。ユーザーはエンコーダに対して十分なサイズのPADDINGブロックを予約するよう指示でき、メタデータが追加されたときに、既存のファイルに挿入する必要なくパディングを単に上書きすることができ、相対的に高速です。
- SEEKTABLE: これは、シークポイントを格納するためのオプションのブロックです。シークテーブルがなくてもFLACストリームの任意のサンプルにシークすることは可能ですが、ビットレートがストリーム内で大きく変動する可能性があるため、遅延が予測できないことがあります。ストリームにシークポイントを追加することで、この遅延を大幅に短縮できます。各シークポイントは18バイトを占めるため、ストリーム内で1%の解像度を持たせても2kB未満の容量しか必要ありません。ストリーム内には1つのSEEKTABLEしか存在できませんが、テーブルには任意の数のシークポイントを含めることができます。また、デコーダによって無視される「プレースホルダ」シークポイントもあり、将来のシークポイント挿入のためにスペースを確保するために使用できます。
- VORBIS_COMMENT: このブロックは、読み取り可能な名前/値のペアのリストを格納するためのものです。値はUTF-8を使用してエンコードされます。これはVorbisコメント仕様の実装です(フレーミングビットなし)。FLACで公式にサポートされている唯一のタグ付けメカニズムです。ストリームには1つのVORBIS_COMMENTブロックしか存在できません。一部の外部ドキュメントでは、混乱を避けるためにVorbisコメントがFLACタグと呼ばれます。
- CUESHEET: このブロックは、キューシートに使用できるさまざまな情報を格納するためのものです。トラックやインデックスポイントをサポートしており、Red Book CDデジタルオーディオディスクと互換性があります。また、メディアカタログ番号やトラックISRCなどの他のCD-DAメタデータもサポートしています。CUESHEETブロックはCD-DAディスクのバックアップに特に便利ですが、再生のための一般的なキューイングメカニズムとしても使用できます。
- PICTURE: このブロックは、ファイルに関連付けられた画像を格納するためのもので、最も一般的にはCDのカバーアートです。ファイル内に複数のPICTUREブロックを含めることができます。画像の形式はID3v2のAPICフレームに似ています。PICTUREブロックには、ID3v2と同様に、タイプ、MIMEタイプ、UTF-8説明があり、URLを介した外部リンクをサポートしていますが、これは推奨されていません。違いとして、説明フィールドには一意性の制約がなく、MIMEタイプは必須です。FLAC PICTUREブロックには解像度、色深度、およびパレットサイズも含まれているため、クライアントはすべての画像をスキャンすることなく適切な画像を検索できます。
- オーディオデータは1つ以上のオーディオフレームで構成されています。各フレームはフレームヘッダーで構成されており、そこには同期コード、ブロックサイズ、サンプルレート、チャンネル数などのフレームに関する情報、そして8ビットのCRCが含まれています。フレームヘッダーには、フレーム内の最初のサンプルのサンプル番号(可変ブロックサイズストリームの場合)またはフレーム番号(固定ブロックサイズストリームの場合)も含まれています。これにより、迅速なサンプル精度のシークが可能になります。フレームヘッダーの後には、各チャンネルごとにエンコードされたサブフレームが続き、最後にフレームはバイト境界にゼロパディングされます。各サブフレームには、サブフレームのエンコード方法を指定する独自のヘッダーがあり、その後にそのチャンネルのエンコードされたオーディオデータが続きます。
- デコーダがストリームの途中でデコードを開始する可能性があるため、フレームの開始位置を特定する方法が必要です。各フレームの最初には14ビットの同期コードがあります。同期コードはフレームヘッダー内の他の場所には表示されません。しかし、これはサブフレーム内に表示される可能性があるため、デコーダは同期が正しいことを確認するために他の2つの方法を持っています。最初は、フレームヘッダーの残りが無効なデータを含まないことを確認することです。しかし、これは完全な方法ではありません。なぜなら、サブフレーム内で有効なヘッダーパターンが依然として発生する可能性があるからです。デコーダの最終チェックは、フレームヘッダーの8ビットのCRCを生成し、これをフレームヘッダーの終わりに格納されているCRCと比較することです。
- 繰り返しになりますが、デコーダがストリーム内の任意のフレームでデコードを開始できるため、フレームヘッダーには、ストリームに関する基本情報が含まれている必要があります。デコーダがストリームの先頭にあるSTREAMINFOメタデータブロックにアクセスできない可能性があるためです。この情報には、サンプルレート、サンプルあたりのビット数、チャンネル数などが含まれます。フレームヘッダーは純粋なオーバーヘッドであるため、圧縮率に直接影響します。フレームヘッダーをできるだけ小さく保つために、FLACはフレームパラメータの最も一般的に使用される値に対してルックアップテーブルを使用します。たとえば、フレームヘッダーのサンプルレート部分は4ビットで指定されます。ビットパターンの8つは、8/16/22.05/24/32/44.1/48/96 kHzの一般的に使用されるサンプルレートに対応しています。ただし、奇数のサンプルレートは、「ヒント」ビットパターンの1つを使用して指定され、フレームヘッダーの最後で正確なサンプルレートを見つけるようデコーダに指示します。同様の方法が、ブロックサイズおよびサンプルあたりのビット数の指定にも使用されます。このようにして、最も一般的な形式のオーディオデータに対して、フレームヘッダーのサイズを小さく保つことができます。
- 各フレーム内の個々のサブフレーム(各チャンネルごとに1つ)は、フレーム内で別々に符号化され、ストリーム内に連続して現れます。言い換えれば、エンコードされたオーディオデータはチャンネル間でインターリーブされません。これにより、デコードバッファが大きくなる必要があるというコストがかかりますが、デコーダの複雑さが軽減されます。各サブフレームには、そのサブフレームの属性(予測方法、順序、残差符号化パラメータなど)を指定する独自のヘッダーがあり、その後にそのチャンネルのエンコードされたオーディオデータが続きます。
- FLACは、自身のサブセットとしてのフォーマットを指定しています。これは、「ストリーム可能」なストリーム、つまりストリーム内でシークできないデコーダでも、ストリームの途中から拾ってデコードを開始できることを保証することを目的としています。また、デコーダのバッファサイズや他のリソース要件を容易に決定できるようにするため、ハードウェアデコーダの実装をより現実的にします。flacはデフォルトでサブセットストリームを生成しますが、「--lax」コマンドラインオプションを使用しない限りです。サブセットは、ストリームで使用されるものに次のような制限を加えます:
- フレームヘッダーのブロックサイズビットは0001-1110でなければなりません。ブロックサイズは<=16384でなければなりません。サンプルレートが<=48000Hzの場合、ブロックサイズは<=4608でなければなりません。
- フレームヘッダーのサンプルレートビットは0001-1110でなければなりません。
- フレームヘッダーのビット毎サンプルビットは001-111でなければなりません。
- サンプルレートが<=48000Hzの場合、LPCサブフレームのフィルタ順序は12以下でなければなりません。つまり、サブフレームヘッダーのサブフレームタイプビットは101100-111111であってはなりません。
- ライス符号化された残差セクションのライス分割順序は8以下でなければなりません。
次の表は、FLACフォーマットの正式な説明を構成しています。角括弧内の数字は、特定のフィールドに使用されるビット数を示しています。
STREAM
<1> |
最後のメタデータブロックフラグ: このブロックがオーディオブロックの前の最後のメタデータブロックであれば '1'、そうでなければ '0'。 |
<7> |
ブロックタイプ - 0 : STREAMINFO - 1 : PADDING - 2 : APPLICATION - 3 : SEEKTABLE - 4 : VORBIS_COMMENT - 5 : CUESHEET - 6 : PICTURE - 7-126 : 予約済み - 127 : 無効(フレーム同期コードとの混同を避けるため) |
<24> |
続くメタデータの長さ(METADATA_BLOCK_HEADERのサイズは含まない) |
<16> |
ストリームで使用される最小ブロックサイズ(サンプル単位)。 |
<16> |
ストリームで使用される最大ブロックサイズ(サンプル単位)。最小ブロックサイズと最大ブロックサイズが同じ場合、固定ブロックサイズのストリームであることを意味します。 |
<24> |
ストリームで使用される最小フレームサイズ(バイト単位)。値が不明であることを示すために0を指定することができます。 |
<24> |
ストリームで使用される最大フレームサイズ(バイト単位)。値が不明であることを示すために0を指定することができます。 |
<20> |
サンプルレート(Hz単位)。20ビットが使用可能ですが、フレームヘッダーの構造により最大サンプルレートは655350Hzに制限されています。また、値が0であることは無効です。 |
<3> |
(チャンネル数)-1。FLACは1から8チャンネルまでをサポートします。 |
<5> |
(ビット毎サンプル)-1。FLACは4ビットから32ビットまでのサンプルをサポートします。 |
<36> |
ストリーム内の総サンプル数。「サンプル」とは、チャネル間のサンプルを意味し、たとえば、44.1kHzのオーディオの1秒間にはチャンネル数に関係なく44100のサンプルが含まれます。ここで値が0の場合、総サンプル数が不明であることを意味します。 |
<128> |
エンコードされていないオーディオデータのMD5署名。これにより、ビットストリームが無効にならないエラーが発生した場合でも、デコーダがオーディオデータにエラーが存在するかどうかを判断できます。 |
|
NOTES
- FLACは最小ブロックサイズを16、最大ブロックサイズを65535に指定しているため、最小ブロックサイズおよび最大ブロックサイズフィールドで0から15に対応するビットパターンは無効です。 |
<n> |
n個の「0」ビット(nは8の倍数でなければならない) |
|
|
<32> |
登録済みのアプリケーションID。(FLACにIDを登録するには、登録ページをご覧ください。) |
<n> |
アプリケーションデータ(nは8の倍数でなければなりません) |
SEEKPOINT+ |
1つ以上のシークポイント。 |
|
NOTE
- シークポイントの数はメタデータヘッダーの「長さ」フィールドによって暗示されます。つまり、長さ / 18に等しいです。 |
SEEKPOINT
<64> |
対象フレームの最初のサンプルのサンプル番号、またはプレースホルダーポイントの場合は0xFFFFFFFFFFFFFFFF。 |
<64> |
対象フレームのヘッダーの最初のバイトまでの、最初のフレームヘッダーの最初のバイトからのオフセット(バイト単位)。 |
<16> |
対象フレーム内のサンプル数。 |
|
NOTES
- プレースホルダーポイントの場合、2番目と3番目のフィールド値は未定義です。 - テーブル内のシークポイントは、サンプル番号で昇順にソートされている必要があります。 - テーブル内のシークポイントは、プレースホルダーポイントを除いてサンプル番号ごとに一意である必要があります。 - 前述の2つの注意点から、プレースホルダーポイントの数に制限はありませんが、それらはすべてテーブルの末尾に配置される必要があります。 |
<128*8> |
メディアカタログ番号。ASCIIの表示可能文字で0x20-0x7eの範囲で表されます。一般的に、メディアカタログ番号は0から128バイトの長さになりますが、未使用の文字はNUL文字で右詰めされます。CD-DAの場合、これは13桁の数字で表され、その後に115バイトのNUL文字が続きます。 |
<64> |
リードインサンプルの数。このフィールドはCD-DAキューシートにのみ意味があります。他の用途では0にするべきです。CD-DAの場合、リードインは目次が保存されるTRACK 00エリアです。正確には、メディアの最初のサンプルから最初のトラックの最初のインデックスポイントのサンプルまでのサンプル数を指します。レッドブックによると、リードインは無音でなければならず、CDリッピングソフトウェアは通常これを保存しません。また、リードインは少なくとも2秒間以上でなければなりませんが、さらに長くてもかまいません。これらの理由から、リードインの長さがここに保存されており、最初のトラックの絶対位置を計算することができます。ここに保存されるリードインは、必ずしも最初のトラックのINDEX 01までではなく、最初のトラックの最初のインデックスポイントまでのサンプル数です。最初のトラックにもINDEX 00のデータが含まれている可能性があります。 |
<1> |
CUESHEETがコンパクトディスクに対応する場合は1、それ以外の場合は0。 |
<7+258*8> |
予約済み。すべてのビットはゼロに設定されなければなりません。 |
<8> |
トラックの数。リードアウトトラックが必要なため、少なくとも1つ以上でなければなりません。CD-DAの場合、この数は最大で100まで(99の通常トラックと1つのリードアウトトラック)にする必要があります。 |
CUESHEET_TRACK+ |
1つ以上のトラック。CUESHEETブロックにはリードアウトトラックが必要で、常にCUESHEETの最後のトラックになります。CD-DAの場合、リードアウトトラック番号はレッドブックで指定されているように170でなければなりません。その他の場合は255でなければなりません。 |
CUESHEET_TRACK
<64> |
FLACオーディオストリームの開始からのトラックオフセット(サンプル単位)。これはトラックの最初のインデックスポイントまでのオフセットです。(CD-DAと異なり、CD-DAではトラックのTOCにおけるオフセットはトラックのINDEX 01のもので、INDEX 00があってもトラックのOFFSETではありません。)CD-DAの場合、オフセットは588サンプル(588サンプル = 44100サンプル/秒 * 1/75秒)で割り切れる必要があります。 |
<8> |
トラック番号。トラック番号が0の場合はCD-DA規格と衝突するため許可されていません。CD-DAの場合、番号は1から99まで、またはリードアウトのために170でなければなりません。非CD-DAの場合、リードアウトのためには255でなければなりません。推奨されるのはトラック1から始めて順に増加させることです。トラック番号はCUESHEET内で一意でなければなりません。 |
<12*8> |
トラックISRC。これは12桁の英数字コードです。詳細はこちらおよびこちらをご覧ください。ISRCが存在しない場合は12のASCII NUL文字を使用できます。 |
<1> |
トラックタイプ:0はオーディオ、1は非オーディオ。これはCD-DA Qチャネル制御ビット3に対応します。 |
<1> |
プレエンファシスフラグ:0はプレエンファシスなし、1はプレエンファシスあり。これはCD-DA Qチャネル制御ビット5に対応します;詳細はこちらをご覧ください。 |
<6+13*8> |
予約済み。すべてのビットはゼロに設定されなければなりません。 |
<8> |
トラックインデックスポイントの数。リードアウトトラックを除き、すべてのトラックには少なくとも1つのインデックスが必要です。CD-DAの場合、この数は100を超えてはいけません。 |
CUESHEET_TRACK_INDEX+ |
リードアウトトラックを除くすべてのトラックの1つ以上のトラックインデックスポイント。 |
CUESHEET_TRACK_INDEX
<64> |
インデックスポイントのオフセット(サンプル単位)、トラックオフセットに対する相対位置。CD-DAの場合、オフセットは588サンプル(588サンプル = 44100サンプル/秒 * 1/75秒)で割り切れる必要があります。オフセットはトラックの開始からのものであり、オーディオデータの開始からではありません。 |
<8> |
インデックスポイント番号。CD-DAの場合、インデックス番号0はトラックのプレギャップに対応します。トラック内の最初のインデックスは0または1でなければならず、その後のインデックス番号は1ずつ増加する必要があります。インデックス番号はトラック内で一意でなければなりません。 |
<3*8> |
予約済み。すべてのビットはゼロに設定されなければなりません。 |
<32> |
D3v2 APICフレームに従った画像のタイプ:
- 0 - その他 - 1 - 32x32ピクセルの「ファイルアイコン」(PNGのみ) - 2 - その他のファイルアイコン - 3 - 表紙(前面) - 4 - 表紙(背面) - 5 - パンフレットページ - 6 - メディア(例: CDのラベル面) - 7 - リードアーティスト/リードパフォーマー/ソリスト - 8 - アーティスト/パフォーマー - 9 - 指揮者 - 10 - バンド/オーケストラ - 11 - 作曲家 - 12 - 歌詞作家/テキスト作家 - 13 - 録音場所 - 14 - 録音中 - 15 - パフォーマンス中 - 16 - 映画/ビデオのスクリーンキャプチャ - 17 - 明るい色の魚 - 18 - イラスト - 19 - バンド/アーティストのロゴタイプ - 20 - 出版社/スタジオのロゴタイプ
その他は予約されており、使用すべきではありません。タイプ1と2の画像は、ファイル内にそれぞれ1つずつのみ存在することができます。 |
<32> |
MIMEタイプ文字列の長さ(バイト単位)。 |
<n*8> |
MIMEタイプ文字列(印刷可能なASCII文字 0x20-0x7e)。MIMEタイプは、データ部分が画像データそのものではなく、画像のURLであることを示すために --> とすることもできます。 |
<32> |
説明文字列の長さ(バイト単位)。 |
<n*8> |
画像の説明(UTF-8)。 |
<32> |
画像の幅(ピクセル単位)。 |
<32> |
画像の高さ(ピクセル単位)。 |
<32> |
画像の色深度(ビット/ピクセル)。 |
<32> |
インデックスカラー画像(例: GIF)の場合、使用されている色数、または非インデックス画像の場合は 0。 |
<32> |
画像データの長さ(バイト単位)。 |
<n*8> |
バイナリ形式の画像データ。 |
FRAME
<14> |
同期コード '11111111111110' |
<1> |
予約: [1] - 0 : 必須値 - 1 : 将来の使用のために予約 |
<1> |
ブロック戦略: [2] [3] - 0 : 固定ブロックサイズストリーム; フレームヘッダーがフレーム番号をエンコード - 1 : 可変ブロックサイズストリーム; フレームヘッダーがサンプル番号をエンコード |
<4> |
インター チャンネルサンプルでのブロックサイズ: - 0000 : 予約済み - 0001 : 192 サンプル - 0010-0101 : 576 * (2n-2) サンプル、すなわち 576/1152/2304/4608 - 0110 : ヘッダーの最後から 8 ビット (blocksize-1) を取得 - 0111 : ヘッダーの最後から 16 ビット (blocksize-1) を取得 - 1000-1111 : 256 * (2n-8) サンプル、すなわち 256/512/1024/2048/4096/8192/16384/32768 |
<4> |
サンプルレート: - 0000 : STREAMINFO メタデータブロックから取得 - 0001 : 88.2kHz - 0010 : 176.4kHz - 0011 : 192kHz - 0100 : 8kHz - 0101 : 16kHz - 0110 : 22.05kHz - 0111 : 24kHz - 1000 : 32kHz - 1001 : 44.1kHz - 1010 : 48kHz - 1011 : 96kHz - 1100 : ヘッダーの最後から 8 ビット サンプルレート (kHz) を取得 - 1101 : ヘッダーの最後から 16 ビット サンプルレート (Hz) を取得 - 1110 : ヘッダーの最後から 16 ビット サンプルレート (十の Hz) を取得 - 1111 : 無効、同期を欺くための 1 の文字列を防ぐ |
<4> |
チャンネル割り当て - 0000-0111 : (独立チャンネル数)-1. 定義されている場合、チャンネル順序は SMPTE/ITU-R 推奨に従います。 割り当ては次のとおりです: - 1 チャンネル: モノ - 2 チャンネル: 左、右 - 3 チャンネル: 左、右、センター - 4 チャンネル: 前左、前右、後左、後右 - 5 チャンネル: 前左、前右、前センター、後/サラウンド左、後/サラウンド右 - 6 チャンネル: 前左、前右、前センター、LFE、後/サラウンド左、後/サラウンド右 - 7 チャンネル: 前左、前右、前センター、LFE、後センター、サイド左、サイド右 - 8 チャンネル: 前左、前右、前センター、LFE、後左、後右、サイド左、サイド右 - 1000 : 左/サイド ステレオ: チャンネル 0 は左チャンネル、チャンネル 1 はサイド (差分) チャンネル - 1001 : 右/サイド ステレオ: チャンネル 0 はサイド (差分) チャンネル、チャンネル 1 は右チャンネル - 1010 : ミッド/サイド ステレオ: チャンネル 0 はミッド (平均) チャンネル、チャンネル 1 はサイド (差分) チャンネル - 1011-1111 : 予約 |
<3> |
サンプルサイズ (ビット): - 000 : STREAMINFO メタデータブロックから取得 - 001 : 8 ビット サンプル - 010 : 12 ビット サンプル - 011 : 予約済み - 100 : 16 ビット サンプル - 101 : 20 ビット サンプル - 110 : 24 ビット サンプル - 111 : 32 ビット サンプル |
<1> |
予約: - 0 : 必須値 - 1 : 将来の使用のために予約| |
<?> |
(可変ブロックサイズの場合) <8-56>: "UTF-8" コーディング サンプル番号 (デコードされた番号は 36 ビット) 4 それ以外の場合 <8-48>: "UTF-8" コーディング フレーム番号 (デコードされた番号は 31 ビット) 4 |
<?> |
i(ブロックサイズビットが 011x の場合) 8/16 ビット (blocksize-1) |
<?> |
(サンプルレートビットが 11xx の場合) 8/16 ビット サンプルレート |
<8> |
CRC-8 (多項式 = x8 + x2 + x1 + x0、初期値 0) のすべての内容、同期コードを含む、CRC の前のすべて |
|
NOTES
1. このビットは、FLAC フレームの最初の 15 ビットが MPEG オーディオ フレームの開始と区別できるように 0 にしておく必要があります (詳細)。 2. 「ブロック戦略」ビットは、ストリーム全体で同じでなければなりません。 3. 「ブロック戦略」ビットは、フレーム内の最初のサンプルのサンプル番号を計算する方法を決定します。ビットが 0 (固定ブロックサイズ) の場合、フレームヘッダーはフレーム番号を上記のようにエンコードし、フレームの開始サンプル番号はフレーム番号にブロックサイズを掛けたものになります。ビットが 1 (可変ブロックサイズ) の場合、フレームヘッダーがフレームの開始サンプル番号自体をエンコードします。 (固定ブロックサイズストリームの場合、最後のブロックのみがストリームのブロックサイズよりも短い場合があります。その場合の開始サンプル番号は、フレーム番号に前のフレームのブロックサイズを掛けたもの、または最初のフレームである場合はゼロになります)。 4. サンプル/フレーム番号に使用される「UTF-8」コーディングは、圧縮 UCS-2 を保存するために使用される可変長コードと同じもので、大きな入力に対応するために拡張されています。 |
<16> |
CRC-16 (多項式 = x16 + x15 + x2 + x0、初期値 0) は、CRC の前のすべての内容、フレームヘッダー同期コードを含むまでの内容の CRC です。 |
|
|
SUBFRAME
<1> |
ゼロビットのパディング、同期を欺く1の文字列を防ぐため |
<6> |
サブフレームタイプ: - 000000 : SUBFRAME_CONSTANT - 000001 : SUBFRAME_VERBATIM - 00001x : 予約済み - 0001xx : 予約済み - 001xxx : xxx <= 4 の場合 SUBFRAME_FIXED、xxx=order ; それ以外は予約済み - 01xxxx : 予約済み - 1xxxxx : SUBFRAME_LPC、xxxxx=order-1 |
<1+k> |
「無駄なビットごとのサンプル」フラグ: - 0 : ソースサブブロックに無駄なビットごとのサンプルはなし、k=0 - 1 : ソースサブブロックに k の無駄なビットごとのサンプルがあり、k-1 が続く、ユニコードで符号化される。例えば、k=3 の場合は 001 が続き、k=7 の場合は 0000001 が続く。 |
SUBFRAME_CONSTANT
<n> |
サブブロックのエンコードされていない定数値、n = フレームのビットごとのサンプル。 |
|
|
SUBFRAME_FIXED
SUBFRAME_LPC
<n> |
エンコードされていないウォームアップサンプル (n = フレームのビットごとのサンプル * LPC の順序) |
<4> |
量子化された線形予測子係数の精度(ビット単位)-1(1111 = 無効) |
<5> |
量子化された線形予測子係数のシフトに必要なビット数(注:この数値は符号付きの二進補数表現) |
<n> |
エンコードされていない予測子係数 (n = 量子化された予測子係数の精度 * LPC の順序)(注:係数は符号付きの二進補数表現) |
RESIDUAL |
エンコードされた残差 |
SUBFRAME_VERBATIM
<n*i> |
エンコードされていないサブブロック; n = フレームのビットごとのサンプル, i = フレームのブロックサイズ |
|
|
RESIDUAL
RESIDUAL_CODING_METHOD_PARTITIONED_RICE
RICE_PARTITION
<4(+5)> |
エンコーディングパラメータ:
- 0000-1110: Riceパラメータ。 - 1111: エスケープコードで、パーティションがnビットのサンプルごとの未エンコードのバイナリ形式であることを意味します。nは5ビットの数値として続きます。 |
<?> |
エンコードされた残差。パーティション内のサンプル数(n)は次のように決定されます: - パーティションオーダーがゼロの場合、n = フレームのブロックサイズ - 予測器のオーダー - それ以外の場合、これがサブフレームの最初のパーティションでない場合、n = (フレームのブロックサイズ / (2^パーティションオーダー)) - それ以外の場合、n = (フレームのブロックサイズ / (2^パーティションオーダー)) - 予測器のオーダー |
RESIDUAL_CODING_METHOD_PARTITIONED_RICE2
RICE2_PARTITION
<5(+5)> |
エンコーディングパラメーター:
- 00000-11110 : Riceパラメーター。 - 11111 : エスケープコードで、パーティションがnビットのサンプルごとの未エンコードのバイナリ形式であることを意味します。nは5ビットの数値として続きます。 |
<?> |
エンコードされた残差。パーティション内のサンプル数 (n) は以下のように決定されます: - パーティションオーダーがゼロの場合、n = フレームのブロックサイズ - 予測子オーダー - それ以外の場合でサブフレームの最初のパーティションでない場合、n = (フレームのブロックサイズ / (2^パーティションオーダー)) - それ以外の場合、n = (フレームのブロックサイズ / (2^パーティションオーダー)) - 予測子オーダー |
この項目では、圧縮された FLAC データが Ogg トランスポートレイヤー内でどのようにカプセル化されるかを説明しています。FLAC フォーマットと Ogg 構造およびフレーミングの基本的な知識が前提とされています。
元々の FLAC フォーマットは非常にシンプルなトランスポートシステムを含んでいます。このシステムは「ネイティブ FLAC」と呼ばれ、圧縮された FLAC オーディオデータと薄いトランスポートが混在しています。このトランスポートはオーディオフレームのヘッダーとフッターを含み、同期パターン、タイムコード、チェックサム(ただしフレーム長は含まれていません)、およびメタデータシステムを持っています。これは非常に軽量で、複数の論理ストリームなどのより高度なトランスポートメカニズムをサポートしていませんが、その目的には適していました。
ネイティブ FLAC トランスポートは、標準的なコーデック設計における「レイヤー」とは異なり、ペイロードから完全に切り離すことができません。メタデータシステムは分離できますが、フレームヘッダーにはトランスポートに関連するデータ(同期パターン、タイムコード、チェックサム)と圧縮パケットに関連するデータ(オーディオパラメータ、チャンネル設定、サンプルレートなど)が含まれています。
これにより、FLAC を他の真のトランスポートレイヤーにカプセル化する際に問題が生じます。冗長性と複雑さの選択が必要です。正確性を追求するために、ネイティブ FLAC からトランスポートデータを削除し、残りのフレームヘッダー情報をオーディオパケットに統合するマッピングを作成することが考えられます。しかし、このアプローチでは現在のネイティブ FLAC デコーダーソフトウェアが使用できなくなるため、別のデコーディング実装を作成し維持する必要があります。または、Ogg FLAC デコーダーが Ogg FLAC パケットからネイティブ FLAC フレームを合成し、それをネイティブ FLAC デコーダーに渡す必要があります。
別の方法として、ネイティブ FLAC フレームを Ogg パケットとして扱い、トランスポートの冗長性を受け入れることができます。この方法では最大 12 バイトの冗長性が生じますが、一般的なステレオ CD オーディオが 4096 サンプルのブロックサイズでエンコードされている場合、圧縮フレームは 4-16 Kバイトになります。冗長性はごくわずかです。
シンプルさと迅速さを重視して、最初の公式 FLAC->Ogg マッピングにはこの方法が選ばれました。将来、冗長性の少ないマッピングが定義できるように、最初のパケットにはマッピングバージョンが含まれています。
FLAC-to-Ogg マッピング バージョン 1.0 は、以下のようにシンプルな識別ヘッダーと純粋なネイティブ FLAC データで構成されています:
ストリームの最初のパケットは以下で構成されています:
- パケットタイプ: 1 バイトで、値は 0x7F
- ASCII シグネチャ: 4 バイトで、"FLAC"(0x46, 0x4C, 0x41, 0x43)
- マッピングバージョン番号: 1 バイトのバイナリ形式で、例えばマッピングバージョン 1.0 の場合は 0x01
- マッピングのマイナーバージョン番号: 1 バイトのバイナリ形式で、例えばマッピングバージョン 1.0 の場合は 0x00
- ヘッダーパケット数: 2 バイトのビッグエンディアン形式で、ヘッダー(非オーディオ)パケットの数を示します(このパケットを含まない)。この数が 0x0000 の場合は「不明」を意味しますが、一部のデコーダーがこのようなストリームを処理できない場合があることに注意してください。
- ネイティブ FLAC シグネチャ: 4 バイトの ASCII 形式で、"fLaC"(FLAC フォーマット仕様に従う)
- STREAMINFO メタデータブロック: ストリーム用の STREAMINFO メタデータブロック
この最初のパケットはストリームの最初のページにのみ存在し、これにより、論理ストリームの最初に正確に 79 バイトの Ogg ページが生成されます。この最初のページはページフラグで「ストリームの始まり」とマークされます。
ヘッダーパケット
最初のパケットに続いて、一つ以上のヘッダーパケットが続きます。各パケットには 1 つのネイティブ FLAC メタデータブロックが含まれます。これらの最初のメタデータパケットは VORBIS_COMMENT ブロックでなければなりません。これらのパケットはページ境界を跨る可能性がありますが、最後のパケットは終了ページを完了させ、最初のオーディオパケットが新しいページの開始となります。メタデータパケットの最初のバイトもパケットタイプとして機能し、その合法的な範囲は (0x01-0x7E, 0x81-0xFE) です。
これらの最初のページにはグラニュール位置がゼロとして設定されています。
オーディオパケット
論理ストリームの最初のオーディオパケットは新しい Ogg ページの開始を示します。ネイティブ FLAC オーディオフレームはストリーム内の後続のパケットとして現れます。各パケットは 1 つの FLAC オーディオフレームに対応しています。各パケットの最初のバイトはパケットタイプを示し、オーディオパケットは常に 0xFF です(ネイティブ FLAC フォーマット仕様に従う)。
ページとパケットの境界
STREAMINFOパケットの冗長フィールド
STREAMINFO パケット内の冗長フィールドはゼロに設定することができます(ネイティブ FLAC では「不明」を示す)。これにより、単一パスエンコーディングが容易になります。これらのフィールドには、最小および最大フレームサイズ、合計サンプル数、および MD5 シグネチャが含まれます。これらのフィールドの「不明」値は、準拠するネイティブ FLAC または Ogg FLAC デコーダーがストリームをデコードするのを妨げることはありません。
すべての FLAC-to-Ogg マッピングのバージョンにおいて、最初の 6 バイトは同じ構造を共有することが意図されています。具体的には、以下の 6 バイトです:
この構造は、異なるバージョンの FLAC-to-Ogg マッピングにおいても共通しています。
デコーダーへの暗黙のヒント
マッピングバージョン番号にはデコーダーへの暗黙のヒントが含まれています。同じメジャーバージョン番号を持つマッピングバージョンは、同じメジャーバージョン番号のデコーダーによってデコード可能であるべきです。たとえば、バージョン 1.x の Ogg FLAC デコーダーは、x < y の場合でもバージョン 1.y の Ogg FLAC ストリームをデコードできるべきです。
もしマッピングがこの前方互換性を破る場合は、メジャーバージョン番号が増加します。
終わり
ここまでお読みいただきありがとうございました。