2012-03-19 23 views
1

サウンドカードレートを44100などに設定すると、実際のレートが44100になることを保証することはできません。私の場合、アプリケーションとALSA間のトラフィック測定値(サンプル/秒) 44066 ... 44084。サンプリングレート偏差とサウンド再生位置

これはリサンプリングの問題に関連するものではありません。「44100」モードでは48000ハードウェアだけで44100の速度でデータを「食べる」必要があります。

この波形が再生されている間、波形上にカーソルを描こうとすると問題が発生します。

long long getCurrentTimeMs(void) 
{ 
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); 
    boost::posix_time::ptime epoch_start(boost::gregorian::date(1970,1,1)); 
    boost::posix_time::time_duration dur = now - epoch_start; 
    return dur.total_milliseconds(); 
} 

:私は、次のC++の関数を使用して、カーソルのWAVファイルから読み込む "理想的な" サンプリングレートを用いた位置(22050、...、44100、...、48000)、スタートをプレイした後に費やしたミリ秒を計算しますQTimerは、カーソルアニメーションのフレームを生成するために使用されますが、QTimerの精度には依存しません。なぜなら、getCurrentTimeMs()で時間を尋ねるので(それは十分正確です)、フレームレートを変えることができます。

2〜3分再生した後、私は何を聞いているのか、私が見ているものに少し違いがあることを見ています - カーソルの位置は1/20秒程度の位置を演奏するよりも大きいです。

私がALSAのコールバックを通過するトラフィックを測定すると、平均値は44083.7サンプル/秒になります。次に、私は実際のレートとして画面描画関数でこの値を使用します。今問題は消える。プログラムはクロスプラットフォームなので、後でWindowsと別のサウンドカードでこの測定値をテストします。

しかし、サウンドと画面を同期させるより良い方法はありますか?サウンドカードに実際に演奏しているサンプル番号などをCPUで消費する方法はありませんか?

答えて

1

これは既知の効果です。これは、たとえばWindowsのレートマッチングで扱われており、ここではLive Sourcesと記載されています。

再生時には、通常、オーディオハードウェアを「クロック」として使用し、「実際の」クロックではなくオーディオ再生に同期させることで効果が対処されます。すなわち、例えば、オーディオサンプリングレート44100の場合、25fpsビデオの次のビデオフレームは、1/25システム時間増分を使用するのではなく、44100/25サンプル再生と同期して提示される。これは、不正確な実効再生レートを補う。

キャプチャでは、ハードウェア自体がまるで要求された速度でデータを配信しているかのように動作します。あなたができることは、効果的なレートを測定し、効果的なサンプリングレートからオーディオをリサンプリングすることです。