2

メディア ファンデーションで ogg デコーダーを作成しました。

サンプル (圧縮データ) としていくつかのパケットを読みましたが、サンプルの時間とサンプルの期間を知る必要があります。

これで、AvgBytesPerSec や SamplesPerSec などがわかりますが、このパラメーターはデータの圧縮解除に使用されます。

それでは、圧縮データを使用してIMFSampleの時間と期間を取得するにはどうすればよいですか?

4

1 に答える 1

2

答える前に、いくつかのことを知っていると仮定します。

  • Vorbis セットアップ パケットの読み取り方法 (ストリームの 1 番目と 3 番目):
    • サンプルレート
    • デコード パラメータ (具体的にはブロック サイズとモード)
  • Vorbis オーディオ パケット ヘッダーの読み取り方法:
    • 検証ビット
    • モード選択
  • サンプル番号に基づいて、圧縮されていない PCM データの現在のタイムスタンプを計算する方法。
  • サンプル数に基づいて、圧縮されていない PCM データのバッファーの期間を計算する方法。

Vorbis 仕様は、最初の 2 つで役立つはずです。オーディオをデコードしていないので、読み込んだ後は、時間、フロア、剰余、およびマッピング構成を安全に破棄できます (技術的には、コードブックも破棄できますが、フロア構成を読み込んだ後でのみ可能です)。 )。

グラニュール ポジションとサンプル ポジションは、Vorbis では互換性のある用語です。

パケット内のサンプル数を計算するには、現在のパケットのブロック サイズを前のパケットのブロック サイズに加算し、4 で割ります。これには 2 つの例外があります。最初のオーディオ パケットは空 (0 サンプル) で、最後のオーディオ パケットはパケットのサイズは、最後のページのグラニュル位置から 2 番目の最後のページのグラニュル位置を差し引いて計算されます。

パケットの最後のサンプル位置を計算するには、次のロジックを使用します。

  1. ストリームの最初のオーディオ パケットは 0 です。
  2. ページ内の最後のフル オーディオ パケットは、ページのグラニュル位置 (最後のページを含む) です。
  3. ページの中央にあるパケットは、ページのグラニュル位置から計算されます。ページ内の最後のフル オーディオ パケットのグラニュル位置から開始し、計算対象の後の各パケット内のサンプル数を減算します。
  4. パケットの初期位置が必要な場合は、前のパケットのグラニュル位置を使用します。

これがどのように行われるかの例が必要な場合は、これ(パブリック ドメイン、C) を読んでみてください。それでも問題が解決しない場合は、リンクできる C# のゼロからの実装があります。

于 2012-10-17T13:51:39.880 に答える