Javascript 调用recordAudio.stopRecording()时套接字连接断开
我正在尝试从浏览器麦克风录制音频,并将其发送回节点服务器,以便使用谷歌云STT服务将其转换为文本 一切正常,但问题是,当我第一次录制音频时,它工作正常录制的音频文件被发送到服务器进行处理,但当我第二次尝试录制时,套接字连接断开,浏览器重新连接到服务器以建立新的套接字连接 以下是客户端代码:Javascript 调用recordAudio.stopRecording()时套接字连接断开,javascript,node.js,sockets,socket.io,recordrtc,Javascript,Node.js,Sockets,Socket.io,Recordrtc,我正在尝试从浏览器麦克风录制音频,并将其发送回节点服务器,以便使用谷歌云STT服务将其转换为文本 一切正常,但问题是,当我第一次录制音频时,它工作正常录制的音频文件被发送到服务器进行处理,但当我第二次尝试录制时,套接字连接断开,浏览器重新连接到服务器以建立新的套接字连接 以下是客户端代码: const socket = io(); const $recordBtn = document.getElementById("record-audio-btn"); const $st
const socket = io();
const $recordBtn = document.getElementById("record-audio-btn");
const $stopRecrdingBtn = document.getElementById("stop-recording-btn");
// $stopRecrdingBtn.disabled = true;
socket.on("message", ({ msg, _id }) => {
console.log("msg & _id >> ", msg, _id);
});
// for record audio with recordRTC
let recordAudio;
$recordBtn.onclick = () => {
$recordBtn.disabled = true;
// $stopRecrdingBtn.disabled = false;
navigator.mediaDevices
.getUserMedia({ audio: { echoCancellation: true } })
.then((stream) => {
recordAudio = RecordRTC(stream, {
type: "audio",
mimeType: "audio/webm",
sampleRate: 44100,
desiredSampleRate: 16000,
recorderType: StereoAudioRecorder,
numberOfAudioChannels: 1, // using monoAudio Channel as backend req it
// get intervals based blobs
// value in milliseconds
timeSlice: 1000,
});
recordAudio.startRecording();
console.log("********** Audio Rec started **************");
})
.catch((err) => console.log("ERROR: >", err));
};
$stopRecrdingBtn.onclick = () => {
$recordBtn.disabled = false;
console.log("************ stopped ***********");
console.log("recordAudio >> ", recordAudio);
recordAudio.stopRecording(() => {
// after stopping the audio, get the audio data
recordAudio.getDataURL(function (audioDataURL) {
var files = {
audio: {
type: recordAudio.getBlob().type || "audio/wav",
dataURL: audioDataURL,
},
};
// send the audio file to the server
console.log("files >> ", files);
socket.emit("message-transcribe", files);
console.log("files Passed to backend for processing!");
});
});
};
- 现在在服务器端,我只是将音频文件写入本地机器
const path = require("path");
const express = require("express");
const http = require("http");
const fs = require("fs");
const socketio = require("socket.io");
// const socketStream = require("socket.io-stream");
const app = express();
const PORT = process.env.PORT || 3000;
const publicDirPath = path.join(__dirname, "../public");
app.use(express.static(publicDirPath));
const server = http.createServer(app);
const io = socketio(server); // passing raw http server to socket.io
app.get("/", (req, res) => {
res.render("index");
});
io.on("connection", (client) => {
console.log("New websocket connection!...");
client.emit("message", {
msg: "New WebSocket connection...",
_id: client.id,
});
client.on("message-transcribe", (data) => {
// we get the dataURL which was sent from the client
const dataURL = data.audio.dataURL.split(",").pop();
// we will convert it to a Buffer
let fileBuffer = Buffer.from(dataURL, "base64");
console.log("fileBuffer >> ", fileBuffer);
// write audio file to local machine using fs.writeFileSync()
fs.writeFileSync("testAudio.wav", fileBuffer);
});
client.on("disconnect", (reason) => {
console.log(`\nDisconnected....\nReason=${reason}\n`);
});
});
server.listen(PORT, () => {
console.log(`Server Up & Listening on PORT: ${PORT}`);
});
编辑:我试图调试这个问题,我想,可能是因为传输错误,我看到如果我录制的音频文件高达700kb-800kb,一切正常,如果文件大小超过该值,我会出现传输错误和套接字断开
尝试发送大小超过700-800kb的base-64编码音频文件时发出
New websocket connection!...
// after initiating file tranfer from browser to server
Disconnected....
Reason=transport error // generated from client.on("disconnect", callback(reason))
New websocket connection!...
感谢您的帮助 因此,在深入研究socket.io文档之后,我发现如果
maxHttpBufferSize
超过1e6
(默认值)以避免Dos,套接字连接就会断开
我希望它能帮助任何有这个问题的人。所以在深入研究socket.io文档之后,我发现如果
maxHttpBufferSize
超过1e6
(默认值),套接字连接会断开,以避免Dos
我希望它能帮助任何有这个问题的人