在O/P问题上,尝试将数据直接写入和添加到现有文件中,但这是行不通的,因为WAVE文件需要有一个标头,而仅仅创建一个写文件流是不可能有标头的使用createWriteStream
。您可以在此处检查该标头格式“WAVE PCM 声音文件格式” http://soundfile.sapp.org/doc/WaveFormat/.
有的是wav https://www.npmjs.com/package/wavNPM包可以帮助处理将数据写入服务器的整个过程。它有FileWriter https://www.npmjs.com/package/wav#filewriterpath-options类创建一个能够正确处理 WAVE 音频数据的流,并在流结束时写入标头。
1. 创建一个 WAVEFileWriter
继续播放start-audio
event:
// Import wav package FileWriter
const WavFileWriter = require('wav').FileWriter;
...
// Global FileWriter stream.
// It won't handle multiple client connections; it's just for demonstration
let outputFileStream;
// The UUID of the filename that's being recorded
let id;
client.on('start-audio', function() {
id = uuidv4();
console.log(`start-audio:${id}`);
// Create a FileWriter stream using UUID generated for filename
outputFileStream = new WavFileWriter(`./audio/recs/${id}.wav`, {
sampleRate: 16000,
bitDepth: 16,
channels: 1
});
});
2.使用我们创建的流写入音频数据binaryData
event:
client.on('binaryData', function(data) {
console.log(`binaryData:${id}, got ${data ? data.length : 0} bytes}`);
// Write the data directly to the WAVE file stream
if (outputFileStream) {
outputFileStream.write(data);
}
});
3. 当我们收到消息时结束流end-audio
event:
client.on('end-audio', function() {
console.log(`end-audio:${id}`);
// If there is a stream, end it.
// This will properly handle writing WAVE file header
if (outputFileStream) {
outputFileStream.end();
}
outputFileStream = null;
});
我用这个例子创建了一个 Github 存储库,你可以在这里找到:https://github.com/clytras/node-wav-stream https://github.com/clytras/node-wav-stream.
请记住,处理这样的数据会导致问题,因为使用此代码,只有一个FileWriter
每个连接的客户端的流变量。您应该为每个客户端流创建一个数组,并使用客户端会话 ID 来存储和标识属于相应客户端的每个流项目。