メディア ファンデーションで ogg デコーダーを作成しました。
サンプル (圧縮データ) としていくつかのパケットを読みましたが、サンプルの時間とサンプルの期間を知る必要があります。
これで、AvgBytesPerSec や SamplesPerSec などがわかりますが、このパラメーターはデータの圧縮解除に使用されます。
それでは、圧縮データを使用してIMFSampleの時間と期間を取得するにはどうすればよいですか?
答える前に、いくつかのことを知っていると仮定します。
Vorbis 仕様は、最初の 2 つで役立つはずです。オーディオをデコードしていないので、読み込んだ後は、時間、フロア、剰余、およびマッピング構成を安全に破棄できます (技術的には、コードブックも破棄できますが、フロア構成を読み込んだ後でのみ可能です)。 )。
グラニュール ポジションとサンプル ポジションは、Vorbis では互換性のある用語です。
パケット内のサンプル数を計算するには、現在のパケットのブロック サイズを前のパケットのブロック サイズに加算し、4 で割ります。これには 2 つの例外があります。最初のオーディオ パケットは空 (0 サンプル) で、最後のオーディオ パケットはパケットのサイズは、最後のページのグラニュル位置から 2 番目の最後のページのグラニュル位置を差し引いて計算されます。
パケットの最後のサンプル位置を計算するには、次のロジックを使用します。
これがどのように行われるかの例が必要な場合は、これ(パブリック ドメイン、C) を読んでみてください。それでも問題が解決しない場合は、リンクできる C# のゼロからの実装があります。