Expo应用经Socket.IO向Node.js服务器流音频时块大小不一致问题排查
音频流式传输到Cloud Run后的块大小异常问题及解决方案
我正在开发一个应用,通过socket.io将音频数据从Expo(React Native)应用流式传输到Node.js服务器,服务器再转发至Deepgram做语音转文本处理。本地环境一切正常:移动端发送的音频块长度固定为8192字节,服务器接收的块大小完全一致。但将服务器部署到Google Cloud Run后,接收的音频块长度开始波动,大概在16000字节左右,没有固定值。
这种块大小变化仅在公网传输时出现,本地无此问题。我初步推测是网络中数据包的合并或处理方式导致的不一致。
我曾尝试用socket.io-stream实现更流畅的流式传输方案,但它依赖Expo环境不存在的Node.js标准库,无法兼容。
Expo客户端代码
import io from 'socket.io-client'; const socket = io('http://myserver.com'); // 发送音频数据的函数 const sendAudioChunk = (audioChunk) => { const int16Array = new Int16Array(audioChunk); const buffer = Buffer.from(int16Array.buffer); socket.emit('audio-chunk', buffer); }; // 示例:发送音频块 sendAudioChunk(audioChunk);
Node.js服务器代码
const server = require('http').createServer(); const io = require('socket.io')(server); io.on('connection', (socket) => { socket.on('audio-chunk', (chunk) => { console.log('Chunk size:', chunk.length); // 转发块到Deepgram }); }); server.listen(3000);
问题
- 为何服务器部署到Cloud Run后音频块大小会发生变化,本地运行时却无此问题?
- 考虑到Expo环境的限制,在此场景下流传输音频数据有哪些最佳实践或替代方案?
问题根源及解决方法
问题出在Socket.IO未升级到WebSocket协议,而是使用HTTP长轮询。原因是我的Cloud Run服务采用HTTPS,但客户端通过不安全的HTTP协议连接。切换为安全WebSocket连接(wss://)后,问题得以解决。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

