我在Stackoverflow上尝试了很多方法,但是都无法实现目标。于是我尝试使用nodejs从树莓派录制音频(1)。然后将这个流通过websocket服务器传输(我没有放出这段代码,因为它只是一个重定向)。最后,vuejs中的websocket监听该流。接着,我想要将该流录制为mp3格式(2),但是有噪声或者没有任何声音。
1 - 树莓派:
ai = new audio.AudioIO({
inOptions: {
channelCount: 1,
sampleFormat: audio.SampleFormat16Bit,
sampleRate: 44100,
deviceId: 6, // Use -1 or omit the deviceId to select the default device
closeOnError: true // Close the stream if an audio error is detected, if set false then just log the error
}
});
ai.on('data', buf => {
clientAudioWebsocket.send(buf)
}
);
ai.start();
2- Vuejs 的第二部分
Socket :
this.dataBuffer = [] var self = this var connectionToLocalServer = new WebSocket("ws://"+ip +":4444") connectionToLocalServer.binaryType = "arraybuffer" connectionToLocalServer.onmessage = function(event) { self.dataBuffer.push(event.data); } connectionToLocalServer.onopen = function(event) { }
part arraybuffer to mp3
concatArrayBuffers (bufs) { var offset = 0; var bytes = 0; var bufs2=bufs.map(function(buf,total){ bytes += buf.byteLength; return buf; }); var buffer = new ArrayBuffer(bytes); var store = new Uint8Array(buffer); bufs2.forEach(function(buf){ store.set(new Uint8Array(buf.buffer||buf,buf.byteOffset),offset); offset += buf.byteLength; }); return buffer } this.tmpResult = this.concatArrayBuffers(this.dataBuffer); var mp3Data = []; var mp3encoder = new lamejs.Mp3Encoder(1, 44100, 128); var mp3Tmp = mp3encoder.encodeBuffer(this.tmpResult, 0, Math.floor(this.tmpResult.byteLength / 2)); //Push encode buffer to mp3Data variable mp3Data.push(mp3Tmp); // Get end part of mp3 mp3Tmp = mp3encoder.flush(); // Write last data to the output data, too // mp3Data contains now the complete mp3Data mp3Data.push(mp3Tmp);
我不明白为什么我的ArrayBuffer有16384大小的缓冲区。
我非常乐意接受任何解决方案,但我不想在服务器端处理它。
谢谢。
array[0]=255
和array[0]=251
吗?如果是的话,那么你的arrayBuffer
可能已经是MP3格式了,这就可以解释为什么Lame编码器输出噪音。 - VC.One