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

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

我的疑问

  1. 是不是我把音频数据转换成Uint8Array再传给.NET的byte[]的方式有问题?
  2. 发送前是不是需要对音频做额外的预处理?
  3. 为什么发送文本没问题,音频块就不行呢?

补充信息

  • SignalR处理文本数据完全正常
  • 我用的是Blazor Web App和最新版的SignalR客户端

备注:内容来源于stack exchange,提问作者Levan Amashukeli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:04:31