3

音楽ファイルからタグ情報を読み取る C ライブラリに取り組んでいます。ID3v2 は既に処理済みですが、Ogg ファイルがどのように構成されているかわかりません。

.ogg ファイルを hexeditor で開いたところ、すべて人間が読み取れるタグ データを見つけることができました。しかし、ファイルの先頭からタグ データまですべてゴミのように見えました。このデータはどのようにエンコードされますか?

実際のコードについては何も助けは必要ありません。Ogg ヘッダーがどのように見えるか、どのエンコーディングを使用しているかを視覚化して、それを読み取れるようにするための助けが必要なだけです。Ogg ファイルを読み取るには、ハックではない方法を使用したいと思います。

私はFlac フォーマットを見てきましたが、これは役に立ちました。

私が見ているFlacファイルには、「fLac」識別子と人間が読めるコメントセクションの間に約350バイトがあり、16進エディターでは人間が読めるものはありません。そのため、そこに何か重要なものがあるはずです.

私は Linux を使用していますが、Windows や OS X に移植するつもりはありません。したがって、エンコーディングを変換するために glibc のみの関数を使用する必要がある場合は、それで問題ありません。

4

2 に答える 2

5

Ogg ファイル形式については、こちらに記載されています。あなたが詳細な書面による説明で要求したように、非常に素晴らしいグラフィカルな視覚化があります.

また、Ogg ファイルを読み書きするためのオープン ソース BSD ライセンス ライブラリであるliboggも参照してください。

于 2009-12-08T17:07:17.047 に答える
4

あなたが提供したリンクで説明されているように、次のメタデータ ブロックは、「fLaC」マーカーと VORBIS_COMMENT メタデータ ブロックの間に発生する可能性があります。

  • STREAMINFO: このブロックには、サンプル レート、チャネル数、サンプルの総数など、ストリーム全体に関する情報が含まれています。これは、ストリーム内の最初のメタデータ ブロックとして存在する必要があります。他のメタデータ ブロックが続く場合があり、デコーダが理解できないものはスキップします。
  • APPLICATION: このブロックは、サードパーティのアプリケーションで使用するためのものです。唯一の必須フィールドは 32 ビットの識別子です。この ID は、FLAC メンテナによるアプリケーションへの要求に応じて付与されます。残りのブロックは、登録されたアプリケーションによって定義されます。アプリケーションの ID を FLAC に登録する場合は、登録ページにアクセスしてください。
  • PADDING: このブロックでは、任意の量のパディングが可能です。PADDING ブロックの内容には意味がありません。このブロックは、エンコード後にメタデータが編集されることがわかっている場合に役立ちます。ユーザーは、エンコーダーに十分なサイズの PADDING ブロックを予約するように指示できます。これにより、メタデータが追加されたときに、パディングを既存のファイルの適切な場所に挿入する必要がなくなります (これは比較的高速です)。通常、ファイル全体を書き換える必要があります)。
  • SEEKTABLE: これは、シーク ポイントを格納するためのオプションのブロックです。シーク テーブルなしで FLAC ストリーム内の任意のサンプルをシークすることは可能ですが、ストリーム内でビットレートが大きく異なる可能性があるため、遅延は予測できません。ストリームにシーク ポイントを追加することで、この遅延を大幅に短縮できます。各シーク ポイントは 18 バイトかかるため、ストリーム内の 1% の解像度で追加されるのは 2k 未満です。ストリーム内に存在できる SEEKTABLE は 1 つだけですが、テーブルには任意の数のシーク ポイントを含めることができます。デコーダーによって無視される特別な「プレースホルダー」シークポイントもありますが、将来のシーク ポイント挿入のためにスペースを確保するために使用できます。

上記の説明の直後に、これらの各ブロックのフォーマットの仕様もあります。リンクにも書いてある

FLAC ビットストリームで使用されるすべての数値は整数です。浮動小数点表現はありません。すべての数値はビッグエンディアンでコーディングされています。特に指定のない限り、すべての数値は符号なしです。

それで、あなたは何が欠けていますか?あなたは言う

Ogg ファイルを読み取るための非ハッキーなアプローチが必要です。

ライブラリが既に存在するのに、なぜそれを行うためにライブラリを書き直すのでしょうか?

于 2009-12-08T17:07:58.867 に答える