2012-03-06 5 views
4

を考えると、以下のパラメータ:いくつかのパラメータを与えられたオーディオのサンプル数を計算するには?

Sample size: 16 
Channel count: 2 
Codec: audio/pcm 
Byte order: little endian 
Sample rate: 11025 
Sample type: signed int 

がどのように録音されたオーディオのN milisecondsのためのサンプル数を決定することができますか?私はオーディオ処理では新しいです。コーデックはPCMなので、圧縮されていないオーディオだと思います。

私はWindows 7 Ultimate x64でQt 4.8を使用しています。

答えて

9

私はあなたが、あなたが望むものをあなたに与えたコードを書くことができるように、これらの用語のそれぞれの意味を理解することがここでは重要だと思います。

サンプルレートは、ケース11025(これはKHzで表示されることがあります)のオーディオの1秒あたりのサンプル数です。これは44.1KHzのCDオーディオと比べるとかなり低いので44100サンプルレートあります48KHz、96KHzなどのより高い基準。

次に、各サンプルに使用されるビット数がありますが、これは通常8/16/24/32ビットです。

次に、サンプルごとに任意の数のチャネルを持つことができます。

すでに掲載されているサンプルコードでは、これらの数値を1つにまとめてミリ秒単位でサンプルに適用する方法を示しています。これは、単純にサンプルビットのチャネル数にサンプルレートを掛けて、その後、この数値を1000で割ってミリ秒単位で入力します。

これは、ビデオをこのビデオに適用すると、23/30/50/60フレームのような素敵な番号をNTSCベースのもの、つまり23.98/29.97/59.94フレームあなたが正しく整列しているかどうかを確認するためには恐ろしい計算をしなければならない。

これが役に立ちます。ここ

+0

良いですが、最後に数式はありません... – UmNyobe

+0

ユーザーperrealは適切なコードサンプルを提供していましたので、複製しないことをお勧めします。 – EdChum

9
/** 
    * Converts milliseconds to samples of buffer. 
    * @param ms the time in milliseconds 
    * @return the size of the buffer in samples 
    */ 
    int msToSamples(int ms, int sampleRate, int channels) { 
     return (int)(((long) ms) * sampleRate * channels/1000); 
    } 

    /* get size of a buffer to hold nSamples */ 
    int samplesToBytes(int nSamples, int sampleSizeBits) { 
     return nSamples * (sampleSizeBits/8); 
    } 

Reference

+0

私はそれが正しく理解されれば、式は '(int((long)ms)* sampleRate * channels/1000)/(sampleSize/8)'であるべきだと思います。私は正しい? – Donotalo

+0

レートはバイト数ではなくサンプル数で定義されているため、サンプル数を計算する場合、サンプルサイズは関係ありません。 – perreal

+0

samplesToBytesには、その乗算のチャンネル数がありません。 – rationalcoder

0

擬似コード中の溶液:

ヘルツ

持続時間= 20 ...ミリ秒& SR = 11025 ...サンプリングレートを考える

サンプルN

のその後数

N = SR *のDUR/1000 = 220.5

これを最も近い整数に丸める必要があります。

関連する問題