2011-02-23 11 views
2

AC3オーディオをデコードするためのDirectShowオーディオデコーダフィルタを開発中です。 フィルタはライブグラフで使用され、TSマルチキャストをデコードします。 demuxer(mainconcept)は、デマルチプレクスされたオーディオデータを提供しますが、サンプルのタイムスタンプは提供しません。DirectShowグラフのオーディオサンプルのタイムスタンプを設定する

オーディオの正しいタイムスタンプはどのように取得/計算できますか?

答えて

1

各AC-3フレームには、6 * 256サンプルのデータが埋め込まれています。サンプリングレートは、(AC-3仕様ディジタルオーディオ圧縮規格(AC-3、E-AC-3)によって定義されているように)32kHz、44.1kHzまたは48kHzとすることができる。フレーム自体にはタイムスタンプがないので、連続したストリームと増分のタイムスタンプをそれぞれ仮定する必要があります。ソースがライブであると述べたので、データの枯渇時にタイムスタンプを再調整する必要があります。

各AC-3フレームは固定長です(ビットストリームヘッダーから識別できます)。したがって、デマルチプレクサが1つのAC-3フレームを提供しているかどうかを確認することもできます。

2

私はこのフォーラムの投稿を見つけた:それは

http://www.ureader.com/msg/14712447.aspx

、部材は、それが形式(サンプルレート、チャンネル数、サンプルあたりのビット)だ所与、オーディオのタイムスタンプを計算するための次の式を与えます:duration_in_secs = 8 * BUFFER_SIZE/wBitsPerSample/ nChannels/nSamplesPerSec又はduration_in_secs = BUFFER_SIZE/ nAvgBytesPerSecは(nAvgBytesPerSecは、PCMオーディオのため、以降のオーディオPCMと

= wBitsPerSample * nChannels * nSamplesPerSec/8)。

追加する必要があるのは、現在のストリームのサンプル番号を示すトラッキング変数です。開始時間と終了時間を継続時間(duration_in_secs)でオフセットすることができます。リニアストリーミングを行う場合シーク操作では、もちろん、サンプル番号をストリームに知ったり、計算したりする必要があります。

DirectShowのタイムスタンプの単位は、REFERENCE_TIME、つまり長整数型またはInt64型であることを忘れないでください。各単位は100ナノ秒に等しい。そのため、10,000,000を1秒あたりの関連フレーム数(FPS)で割った値をビデオフィルタで見ると、REFERENCE_TIME変数で10,000,000が1秒に等しいので、各フレームのタイムスタンプを計算します。

関連する問題