gpt4 book ai didi

javascript - 重新开始写入流 nodejs

转载 作者:搜寻专家 更新时间:2023-11-01 00:35:22 25 4
gpt4 key购买 nike

我设置了一个应用程序,我在其中通过 http 从实时流中录制音频。我正在做一些音频处理,然后将生成的音频记录到一个文件中。录制 30 秒后,我想停止录制并保存文件(然后上传)。当我需要再开始录制 30 秒时,我会继续处理音频以寻找下一个点。我遇到的问题是,在我第一次停止录制后,当我想第二次开始录制时,我一直遇到错误。

错误是:Error: write after end

我想这与 encoder.end()

这一行有关

还有什么方法可以停止录制,但稍后又可以重新开始录制?

var encoder = new lame.Encoder({
// input
channels: 1, // 2 channels (left and right)
bitDepth: 16, // 16-bit samples
sampleRate: 44100, // 44,100 Hz sample rate

// output
bitRate: 128,
outSampleRate: 22050,
mode: lame.MONO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});


var recordingDecoder;
module.exports.startRecording = function(decoder) {
if(isRecording)
return false;

recordingDecoder = decoder;
isRecording = true;
recordingDecoder.pipe(encoder);
var writeStream = fs.createWriteStream('../recorded_calls/currentCall.wav');
encoder.pipe(writeStream);

}

module.exports.stopRecording = function() {
if(isRecording) {
console.log('stop recording', encoder)
encoder.end();
isRecording = false;
}

}

编辑:添加了 unripe() 然后删除文件。

module.exports.stopRecording = function() {
if(isRecording) {
console.log('stop recording')
recordingDecoder.unpipe(encoder);
isRecording = false;
}

}

编辑:根据关于拥有多个编码器的建议,我将编码器移动到 startRecording 函数中创建,然后在完成录制后将其设置为 false。

var encoder;


var recordingDecoder;

module.exports.startRecording = function(decoder) {


encoder = new lame.Encoder({
// input
channels: 1, // 2 channels (left and right)
bitDepth: 16, // 16-bit samples
sampleRate: 44100, // 44,100 Hz sample rate

// output
bitRate: 128,
outSampleRate: 22050,
mode: lame.MONO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO
});


console.log('strat recording')

if(isRecording)
return false;

recordingDecoder = decoder;
isRecording = true;
recordingDecoder.pipe(encoder);
var writeStream = fs.createWriteStream('../recorded_calls/currentCall.wav');
encoder.pipe(writeStream);





}

module.exports.stopRecording = function() {
if(isRecording) {
console.log('stop recording')
recordingDecoder.unpipe(encoder);
isRecording = false;
encoder = false;
}

}

最佳答案

结束管道中间的流就像关闭水管中间的阀门,这会在水仍在流动或流仍在提供数据时对阀门产生压力。相反,你想 unpipe来自编码器的录音,然后您可以稍后再次管道它。如果您 unpipe 的时间较长,完全关闭流并在下次使用时重新创建它可能会有好处。

关于javascript - 重新开始写入流 nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com