2

libsndfile を使用して読み込んだ 2 つのオーディオ ファイルがあります。

SNDFILE* file1 = sf_open("D:\\audio1.wav", SFM_READ, &info);
SNDFILE* file2 = sf_open("D:\\audio2.wav", SFM_READ, &info2);

前の手順を実行した後、x 個のサンプルをサンプリングします。

//Buffers that will hold the samples
short* buffer1 = new short[2 * sizeof(short) * 800000];
short* buffer2 = new short[2 * sizeof(short) * 800000];

// Read the samples using libsndfile
sf_readf_short(file1, buffer1, 800000);
sf_readf_short(file2, buffer2, 800000);

今、私はそれらの2つを混ぜたいと思っています。左右のチャンネルを別々に取得してから合計する必要があると読みました。私はこのようにしてみました:

short* mixdown = new short[channels * sizeof(short) * 800000];
for (int t = 0; t < 800000; ++t)
{
    mixdown[t] = buffer1[t] + buffer2[t] - ((buffer1[t]*buffer2[t]) / 65535);
    t++;
    mixdown[t] = buffer1[t] + buffer2[t] - ((buffer1[t]*buffer2[t]) / 65535);
}

その後、ffmpeg を使用して新しいオーディオをエンコードしています。

FILE* process2 = _popen("ffmpeg -y -f s16le -acodec pcm_s16le -ar 44100 -ac 2 -i - -f vob -ac 2 D:\\audioMixdown.wav", "wb");
fwrite(mixdown, 2 * sizeof(short) * 800000, 1, process2);

問題は、バッファ 1 からのオーディオがミックスダウンで問題なく聞こえることですが、ミックスダウンをファイルにエンコードするときに、新しいオーディオに「追加」されるのはノイズ (古いオーディオ録音の場合など) だけです。

2つのうちの1つだけをファイルにエンコードすると、完全に機能します。

なぜうまくいかないのかわかりません。明らかにミキシングと関係があると思いますが、何が間違っているのかわかりません。ここで混合アルゴリズムを取得しましたが、期待した結果が得られません。

同様の質問をしている人々に関するSOに関する他の情報も読みましたが、それらではわかりませんでした。

4

2 に答える 2

2

あなたのアルゴリズムは正しいですが、重要な点を見落としています: PCM の範囲は から-32768まで32767です。32768したがって、 ではなく で割る必要があります65535

于 2015-02-24T11:35:30.567 に答える
2

ミキシング コードは非常に奇妙です - 歪みをもたらす非線形項を追加しているようです - ダイナミック レンジが非常に限られている 8 ビット PCM に特化したハックのようですが、おそらくその必要はありません。 16 ビット PCM の場合はこれについて心配してください。基本的なミキシングでは、これが必要です:

for (int t = 0; t < 800000 * 2; ++t)
{
    mixdown[t] = (buffer1[t] + buffer2[t]) / 2;
}

2 つのフルスケール信号がある場合、歪みを防ぐために 2 で割る必要があることに注意してください。2x ループ展開を削除したことにも注意してください。

于 2015-02-24T09:57:53.703 に答える