2013-08-21 123 views
7

我用getUserMedia()做了一个录音机。使用Recorder.js保存文件HTML5以低kbps记录音频

但输出文件比我想要的要重得多。

4分钟的音频记录有40MB的东西。我无法将其发送到我的服务器。如果是这样,它会崩溃。

所以,我搜索了如何减少记录kbps。但我什么都没发现。只是一些Flash解决方案。但是这些不适合我的项目。

所以,我的问题是,是否有可能使用getUserMedia()降低音频记录的kbps?

回答

1

你有几个选项。首先,对于较小尺寸的缩小,您可以随时修改RecorderJS中的recorderWorker.js文件以使用较低的采样率和位深度。这需要了解数字音频如何工作的一些知识,以及使用键入阵列的某种程度的舒适性 - 但不应太难。如果沿着这条路走,this page对WAVE格式有很好的解释。减少比特深度应该是相当直接的。降采样可能会稍微复杂一点,但应该通过一点研究来实现。一旦你获得了你想要的位深度和采样率,改变RecorderJS的encodeWAV函数中的标题应该是非常简单的。

另一种选择是转换为有损格式(例如MP3)。 This是我现在知道的唯一可以做到这一点的图书馆,尽管可能会有更多。我没有真正使用过这个,并且听说它有点慢 - 但是如果这是一个问题,你可以在网络工作者中运行它。

10

在我的情况下,Chrome在96kHz和Firefox上以44.1kHz记录音频,这使得巨大的WAV文件。我实现了内部recorderWorker.js降采样功能,您可以选择您想要的采样率,如16000

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; 
} 

,我把它称为导出WAV文件时:

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); 
} 
+0

不错!我会尽快测试它! –

+0

另一个策略可能不是计算平均比特率,只考虑每个步骤的一个采样:'result [offsetResult] = buffer [offsetBuffer];' –

+0

这似乎工作正常。 – Knelis