html 5 recordサンプリングレートを変更すると、サウンドが再生されないソリューション

6935 ワード

最近のプロジェクトではweb録音が用いるが、録音のサンプリングレートはデフォルトの44100ではなく8000に設定する必要がある.しかしsamplerateを修正すると、録音が正常に再生されず、ノイズが再生されていることがわかりました.stackOverFlowで検索したソリューションは次のとおりです.
function downsampleBuffer(buffer, rate) {
    if (rate == sampleRate) {
        return buffer;
    }
    if (rate > sampleRate) {
        throw "downsampling rate show be smaller than original sample rate";
    }
    var sampleRateRatio = sampleRate / rate;
    var newLength = Math.round(buffer.length / sampleRateRatio);
    var result = new Float32Array(newLength);
    var offsetResult = 0;
    var offsetBuffer = 0;
    while (offsetResult < result.length) {
        var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
        var accum = 0, count = 0;
        for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
            accum += buffer[i];
            count++;
        }
        result[offsetResult] = accum / count;
        offsetResult++;
        offsetBuffer = nextOffsetBuffer;
    }
    return result;
}
function exportWAV(rate, type) {
    var bufferL = mergeBuffers(recBuffersL, recLength);
    var bufferR = mergeBuffers(recBuffersR, recLength);
    var interleaved = interleave(bufferL, bufferR);
    var downsampledBuffer = downsampleBuffer(interleaved, rate);
    var dataview = encodeWAV(rate, downsampledBuffer, false);
    var audioBlob = new Blob([ dataview ], {
        type : type
    });

    this.postMessage(audioBlob);
}

原文リンク:stackoverflow
プロジェクトに集積して完璧に問題を解決することができないことを発見して、多くの資料を探して1篇の良い博文を発見します:html 5録音
詳細を読むと、downsampleBuffer(buffer,rate)関数のvar sampleRateRatio=sampleRate/rate;整数ではないので、var sampleRateRatio=Mathに変更します.round(sampleRate/rate);
修正後のコード:
function downsampleBuffer(buffer, rate) {
    if (rate == sampleRate) {
        return buffer;
    }
    if (rate > sampleRate) {
        throw "downsampling rate show be smaller than original sample rate";
    }
    var sampleRateRatio = Math.round(sampleRate / rate); //     ,        
    var newLength = Math.round(buffer.length / sampleRateRatio);
    var result = new Float32Array(newLength);
    var offsetResult = 0;
    var offsetBuffer = 0;
    while (offsetResult < result.length) {
        var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
        var accum = 0,
            count = 0;
        for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
            accum += buffer[i];
            count++;
        }
        result[offsetResult] = accum / count;
        offsetResult++;
        offsetBuffer = nextOffsetBuffer;
    }
    return result;
}
function exportWAV(type) {
    var buffers = [];
    for (var channel = 0; channel < numChannels; channel++) {
        buffers.push(mergeBuffers(recBuffers[channel], recLength));
    }
    if (numChannels === 2) {
        var interleaved = interleave(buffers[0], buffers[1]);
        var downsampledBuffer = downsampleBuffer(interleaved, 8000);
        var dataview = encodeWAV(8000, downsampledBuffer);
    } else {
        var interleaved = buffers[0];
        var downsampledBuffer = downsampleBuffer(interleaved, 8000);
    }
    var dataview = encodeWAV(8000,downsampledBuffer);
    var audioBlob = new Blob([dataview], {
        type: type
    });

    this.postMessage(audioBlob);
}

ここでwavエクスポートも適切な修正が必要です.
これにより、従来のシステムにおけるデフォルトサンプリングレート44100を8000に変更すると、音声歪みの問題は完璧に解決される.