インターリーブされた 16 ビット PCM サンプルを回線経由で受信しています。各サンプルは署名されています
これを Int16bit 配列として読み取り、これを ALL_DATA と呼びます。したがって、各配列エントリは 16 ビット サンプルです。
インターリーブされているため、2 チャネル RLRL に抽出します。ALL_DATA 配列の半分のサイズの 2 (16 ビット) 配列になります。
その後、各サンプルを調べて、それを Float32Array に正規化します。これは、Web オーディオ API が使用するものだからです。
var normalizedSample= (サンプル > 0) ? サンプル / 32768 : サンプル / -32768;
これは正しい方法ですか?
音が歪んでいます。何が起こっているかがわかります。文字通り、クラシック ギターを聴いていると、歪みのあるエレクトリック ギターのように聞こえます。
引数のために、サンプルコードを書き留めていますが、このコードは処理します
MONO SOUND は例を単純にするため、インターリーブする必要はありません。
var startTime = 0;
var fileReader = new FileReader();
fileReader.onload = function (e) {
var data = new DataView(e.target.result);
var audio = new Int16Array(data.byteLength / Int16Array.BYTES_PER_ELEMENT);
var len = audio.length;
for (var jj = 0; jj < len; ++jj) {
audio[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true);
}
var right = new Float32Array(audio.length);
var channleCounter = 0;
for (var i = 0; i < audio.length; ) {
var normalizedRight = (audio[i] > 0) ? audio[i] / 32768 : audio[i] / -32768;
i = i + 1;
right[channleCounter] = normalizedRight;
channleCounter++;
}
var source = audioContext.createBufferSource();
var audioBuffer = audioContext.createBuffer(1, right.length, 44100);
audioBuffer.getChannelData(0).set(right);
source.buffer = audioBuffer;
source.connect(audioContext.destination);
source.noteOn(startTime);
startTime += audioBuffer.duration;
};
歪んだ音を引き起こしている可能性のある提案があれば役立ちます。サーバー側でファイルに送信する前にpcmデータを書きましたが、音も良く、完璧です。