2

私は2つのファイルを持っています。mp3がpcmにデコードされてストリームになり、wavもpcmに読み込まれます。サンプルは短いデータ型で保持されています。

オーディオ統計: 44,100 サンプル * サンプルあたり 16 ビット * 2 チャネル = 1,411,200 ビット/秒

mp3 pcm データの先頭に適用する必要がある X 秒間の沈黙があり、次のようにしています。

private short[] mp3Buffer = null;
private short[] wavBuffer = null;
private short[] mixedBuffer = null;

double silenceSamples = (audioInfo.rate * padding) * 2;
for (int i = 0; i < minBufferSize; i++){

    if (silenceSamples > 0 ){

        mp3Buffer[i] = 0; //Add 0 to the buffer as silence

        mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);  
        silenceSamples = silenceSamples - 0.5;
    }
    else
        mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);
}

オーディオは常にオフです。1 秒か 2 秒速すぎることもあれば、1 秒か 2 秒遅すぎることもあります。最初にオーディオレコード(wav)を開始してから、タイマーの開始->メディアプレーヤーの開始(準備済み)->タイマーの終了を設定し、その差を「パディング」変数に設定するため、タイミングに問題があるとは思いません。また、wav ヘッダーから 44kb をスキップしています。

どんな助けでも大歓迎です。

4

1 に答える 1

1

ストリームの 1 つの開始時にパディングを挿入することにより、2 つのオーディオ ソースを何らかの方法で整列させたいと考えていると思いますか? ここにはいくつか問題があります。

mp3Buffer[i] = 0; //Add 0 to the buffer as silence

これは先頭に無音を追加するのではなく、配列のオフセット [i] のエントリを 0 に設定するだけです。次の行:

mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);

次に、この値を上書きします。

何らかの方法でストリームを整列させたい場合、どちらかのストリームの先頭に無音を挿入するのではなく、一方のストリームをもう一方のストリームからずらしてミキシングを開始するのが最善の方法です。また、それらを 32 ビットの浮動小数点数に混ぜてから正規化することをお勧めします。何かのようなもの:

    int silenceSamples = (audioInfo.rate * padding) * 2;
            float[] mixedBuffer = new float[minBufferSize + silenceSamples]
    for (int i = 0; i < minBufferSize + silenceSamples; i++){

    if (i < silenceSamples )
    {       
        mixedBuffer[i] = (float) stereoWavBuffer[i];  
    }
    else if(i < minBufferSize)
    {
        mixedBuffer[i] = (float) (stereoWavBuffer[i] + mp3Buffer[i-silenceSamples]);
    }
    else 
    {
        mixedBuffer[i] = (float) (mp3Buffer[i-silenceSamples]);
    }

データを正規化するには、mixedBuffer を実行して絶対最大値を見つけ、Math.abs(...)配列内のすべての値を 32,767/largestValue で乗算する必要があります。これにより、最大値がクリッピングなしで short に収まるバッファーが得られます。次に、float 配列を反復処理して、各値を短い配列に戻します。

あなたminBufferSizeが何であるかわかりません-これは、すべてのデータを混合するのに十分な大きさである必要があります.

于 2012-05-23T22:28:33.467 に答える