JavaScript通过SignalR向.NET Hub发送音频流失败的问题求助
JavaScript通过SignalR向.NET Hub发送音频流失败的问题求助
我正在尝试把浏览器标签页中用JavaScript捕获的音频流发送到.NET SignalR Hub,目标是把音频分成块实时发送到服务器,再广播给所有连接的客户端。
我的环境配置
SignalR Hub
我建了一个名为/SoundHub的Hub,里面有这样一个方法:
public class SoundHub : Hub { public async Task SendAudioChunk(byte[] audioChunk) { await Clients.All.SendAsync("ReceiveAudio", audioChunk); } }
JavaScript客户端
我用navigator.mediaDevices.getDisplayMedia捕获系统音频,再通过SignalR发送音频块,代码如下:
window.startScreenSharing = async function () { try { const connection = new signalR.HubConnectionBuilder() .withUrl("/soundHub") .withAutomaticReconnect() .build(); await connection.start(); console.log("SignalR connection established."); const stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }); const audioContext = new AudioContext(); const audioSource = audioContext.createMediaStreamSource(stream); const processor = audioContext.createScriptProcessor(2048, 1, 1); audioSource.connect(processor); processor.connect(audioContext.destination); processor.onaudioprocess = async (event) => { const inputBuffer = event.inputBuffer.getChannelData(0); const intBuffer = new Int16Array(inputBuffer.length); for (let i = 0; i < inputBuffer.length; i++) { intBuffer[i] = Math.max(-32768, Math.min(32767, inputBuffer[i] * 32767)); } const audioChunk = new Uint8Array(intBuffer.buffer); try { if (connection.state === signalR.HubConnectionState.Connected) { await connection.invoke("SendAudioChunk", audioChunk); console.log(`Audio chunk sent: ${audioChunk.length} bytes`); } else { console.warn("SignalR connection is not in 'Connected' state."); } } catch (err) { console.error("Error sending audio chunk:", err); } }; } catch (err) { console.error("Error setting up screen sharing and audio streaming:", err); } };
遇到的问题
如果把Hub方法的参数改成string类型,发送文本数据完全没问题,但一发送音频块(Uint8Array),Hub里的方法就完全没触发——我在方法里加了日志,根本没执行到那一步。
浏览器控制台会抛出这个错误:
Error sending audio chunk: Error: Failed to invoke 'SendAudioChunk' due to an error on the server.
已经做的排查
- 确认JavaScript能正确捕获音频,并且能生成并发送音频块
- SignalR连接已经成功建立,调用
SendAudioChunk时连接状态确实是Connected
我的疑问
- 是不是我把音频数据转换成
Uint8Array再传给.NET的byte[]的方式有问题? - 发送前是不是需要对音频做额外的预处理?
- 为什么发送文本没问题,音频块就不行呢?
补充信息
- SignalR处理文本数据完全正常
- 我用的是Blazor Web App和最新版的SignalR客户端
备注:内容来源于stack exchange,提问作者Levan Amashukeli
相关产品推荐
相关产品推荐

