You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

问题

  1. 为何服务器部署到Cloud Run后音频块大小会发生变化,本地运行时却无此问题?
  2. 考虑到Expo环境的限制,在此场景下流传输音频数据有哪些最佳实践或替代方案?

问题根源及解决方法

问题出在Socket.IO未升级到WebSocket协议,而是使用HTTP长轮询。原因是我的Cloud Run服务采用HTTPS,但客户端通过不安全的HTTP协议连接。切换为安全WebSocket连接(wss://)后,问题得以解决。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:32:56