大数跨境
0
0

.NET 8 + Mediasoup 可落地的实时音视频通信架构(收藏版)

.NET 8 + Mediasoup 可落地的实时音视频通信架构(收藏版) dotNET跨平台
2025-12-26
4
导读:前言一个基于 .NET 8 的高性能实时音视频通信解决方案,采用 Mediasoup SFU 架构,支持 W

前言

一个基于 .NET 8 的高性能实时音视频通信解决方案,采用 Mediasoup SFU 架构,支持 WPF 桌面端 + Vue.js Web 端 多端互通。

项目介绍

一个基于.NET 8 的完整实时音视频通信解决方案,采用 Mediasoup SFU 架构实现高性能的 WebRTC 媒体服务

项目包含 Mediasoup 核心库(C# 实现)、libuv 异步 I/O 绑定、ASP.NET Core 集成中间件、SignalR 信令服务器,以及 WPF 桌面客户端和 Vue.js Web 客户端。

支持 Open/Pull/Invite 三种服务模式,提供房间管理、音视频采集传输、多端互通等功能。技术栈涵盖 WebRTC、SignalR、SIPSorcery、OpenCvSharp、NAudio 等,适用于在线会议、远程协作、直播互动等场景。

核心特性

完整 SFU 架构:基于 Mediasoup 实现选择性转发单元(Selective Forwarding Unit),支持大规模并发。

多端互通:WPF 桌面客户端与 Vue.js Web 客户端无缝互通。

三种服务模式

1、Open(开放):自由加入、自动推拉流。

2、Pull(拉取):按需拉流,节省带宽。

3、Invite(邀请):管理员控制推流权限,适用于正式会议。

实时音视频:低延迟、高质量的采集、编码、传输与渲染。

房间管理:完整的房间生命周期与成员控制。

活跃发言者检测:基于音频级别的发言者识别。

JWT 认证:安全的用户身份验证机制。

多编解码器支持:VP8 / VP9 / H.264(视频)、Opus(音频)等主流编解码器。

技术栈

后端技术

技术
版本
用途
.NET
8.0
运行时框架
ASP.NET Core
8.0
Web 框架
SignalR
8.0
实时双向通信
Mediasoup
3.15.7
SFU 媒体服务器
FlatBuffers
-
高效序列化
Redis
-
分布式缓存(可选)
Serilog
-
结构化日志
Swagger
-
API 文档

客户端技术

技术
用途
WPF
桌面客户端 UI 框架
SIPSorcery
.NET WebRTC 实现
NAudio
音频采集与处理
OpenCvSharp
视频采集与处理
FFmpeg
编解码支持
CommunityToolkit.Mvvm
MVVM 框架
Vue.js 3
Web 前端框架
mediasoup-client
浏览器 WebRTC 客户端

支持的编解码器

类型
编解码器
音频
Opus (48kHz, 立体声)
视频
VP8, VP9, H.264(多种 Profile)

三种服务模式详解

1、Open 模式(开放模式)

  • 适用场景:自由会议、开放讨论

  • 用户进入后立即开始推流

  • 自动消费房间内其他用户的媒体流

  • 媒体流即使无人消费也不会停止

  • 其他用户被动接收媒体流

2、Pull 模式(拉取模式)

  • 适用场景:大型会议、按需观看

  • 用户主动选择要拉取的媒体流

  • 按需触发其他用户推流

  • 无人消费时自动停止推流(节省带宽)

  • 其他用户不会被动接收

3、Invite 模式(邀请模式)

  • 适用场景:正式会议、课堂直播

  • 仅管理员可邀请用户推流

  • 用户可申请推流,需管理员同意

  • 管理员可关闭任意用户的媒体流

  • 媒体流断开后需重新申请

系统架构图

解决方案架构

项目使用

环境要求

  • .NET 8.0 SDK

  • Node.js 18+

  • Redis(可选)

  • mediasoup-worker 原生二进制文件

1、克隆项目

2、配置服务端

编辑 src/Dorisoy.Meeting.Web/mediasoupsettings.json

{
  "MediasoupStartupSettings": {
    "MediasoupVersion""3.15.7",
    "NumberOfWorkers"1,
    "UseWebRtcServer"true
  },
"MediasoupSettings": {
    "WebRtcServerSettings": {
      "ListenInfos": [
        {
          "Protocol""udp",
          "Ip""0.0.0.0",
          "AnnouncedAddress""你的公网或局域网IP",
          "Port"44444
        }
      ]
    }
  },
"MeetingServerSettings": {
    "ServeMode""Open"// Open, Pull 或 Invite
  }
}

3、启动服务端

cd src/Dorisoy.Meeting.Web
dotnet run
  • HTTP API: http://localhost:9000
  • SignalR Hub: ws://localhost:9000/hubs/meetingHub
  • Swagger: http://localhost:9000/swagger

4、启动 Web 客户端

cd src/Dorisoy.Meeting.Web.Client
npm install
npm run dev

5、启动 WPF 客户端

cd src/Dorisoy.Meeting.Client
dotnet run

项目依赖

服务端 NuGet 包

<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.10.48" />
<PackageReference Include="FlatSharp.Runtime" Version="7.5.1" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />

客户端 NuGet 包(WPF)

<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.0" />
<PackageReference Include="SIPSorceryMedia.Windows" Version="8.0.5" />
<PackageReference Include="SIPSorceryMedia.FFmpeg" Version="1.2.0" />
<PackageReference Include="NAudio" Version="2.2.1" />
<PackageReference Include="OpenCvSharp4.Windows" Version="4.9.0" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />

生产环境配置建议

HTTPS 配置(appsettings.json

{
  "Kestrel": {
    "Endpoints": {
      "Https": {
        "Url""https://0.0.0.0:443",
        "Certificate": {
          "Path""/path/to/cert.pfx",
          "Password""your-password"
        }
      }
    }
  }
}

公网 IP 配置(mediasoupsettings.json

{
  "MediasoupSettings": {
    "WebRtcServerSettings": {
      "ListenInfos": [{
        "Ip""0.0.0.0",
        "AnnouncedAddress""公网IP或域名"
      }]
    }
  }
}

开放端口

  • TCP 9000(HTTP/WebSocket)

  • UDP/TCP 44444(WebRTC)

  • UDP 40000–49999(媒体传输)

容量规划(局域网部署)

基准:2.5 Gbps 局域网,预留 20% 开销 → 可用 ≈ 2000 Mbps

视频质量档位

档位
分辨率
比特率
帧率
适用场景
Low
320×240
300 Kbps
15 fps
低带宽、大型培训
Standard
640×480
1 Mbps
25 fps
日常会议
High
1280×720
2.5 Mbps
30 fps
小型高清会议
Ultra
1920×1080
5 Mbps
30 fps
小型 1080p 会议

最大客户端数量(SFU 出站带宽 ≈ N×(N−1)×bitrate)

质量档位
VP8
VP9
H264
说明
Low (300K)
~82
~98
~82
大型会议
Standard (1M)
~45
~54
~45
中型会议
High (2.5M)
~29
~35
~29
小型高清
Ultra (5M)
~20
~24
~20
小型 1080p

VP9 节省约 30% 带宽;H264 支持硬件加速,CPU 负载最低

推荐配置方案

会议规模
推荐档位
推荐编解码器
原因
5–10 人
High / Ultra
H264
硬件加速,低 CPU
10–30 人
Standard
VP9
高压缩效率
30–50 人
Low / Standard
VP9
最大化人数
50+ 人
Low
VP9
带宽优先

⚠️ 超过 50 人建议使用 PipeTransport 跨 Router 扩展

项目效果




常见问题

Q: WebRTC 连接失败?

  • 检查 AnnouncedAddress 是否为公网/局域网可达 IP

  • 确保 UDP/TCP 44444 开放

  • 查看 ICE 候选日志

Q: 音视频无法显示?

  • 检查浏览器摄像头/麦克风权限

  • 查看 Console / Network 错误

  • 确认编解码器兼容性

Q: 如何调整视频质量?

修改 mediasoupsettings.json

{
  "WebRtcTransportSettings": {
    "InitialAvailableOutgoingBitrate"1000000,
    "MaximumIncomingBitrate"1500000
  }
}

Q: 如何支持更多用户?

  • 增加 NumberOfWorkers

  • 使用负载均衡

  • 启用 PipeTransport 跨 Router

Q: 编解码器信息传递流程?

客户端 A (VP9) 
   → produce(video/VP9, PT=103)
   → Mediasoup Server
   → newConsumer 通知 (rtpParameters.codecs[0].mimeType = "video/VP9")
   → 客户端 B 使用 VP9 解码器

Q: H.264 RTP 打包流程(RFC 6184)?

H.264 关键帧(Annex B):

[00 00 00 01][SPS][00 00 00 01][PPS][00 00 00 01][IDR]

→ 分离 NAL 单元:

  • SPS (type 7) → Single NAL Unit Packet

  • PPS (type 8) → Single NAL Unit Packet

  • IDR (type 5) → FU-A 分片(若 > MTU)

每个 RTP 包最后一个 NAL 的末包设置 Marker Bit = 1

项目源码

为了防止丢失,可以在评论区留言关键字音视频开发,即可获取完整源码地址。

关键词

.NET 8、#Mediasoup#SFU架构#WebRTC#实时音视频#SignalR#WPF客户端#Vue.js、#SIPSorcery#NAudio#OpenCvSharp、三种服务模式、房间管理、活跃发言者检测、JWT认证、VP8/VP9/H.264、#Opus#libuv、FlatBuffers、#Docker部署

最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。

作者:小码编匠

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!



END



方便大家交流、资源共享和共同成长
纯技术交流群,需要加入的小伙伴请扫码,并备注加群



推荐阅读






.NET 8 + Avalonia 实现跨平台的视频会议(Windows、Linux、信创)
C# 工业路径绘制系统:UI 架构、SkiaSharp 渲染、工业格式导出
一套工业级 WinForm 矢量图形库,搞定组态、仿真中的图形开发
工业级零丢失、高并发 PLC 数据采集系统(支持 .NET 8/10)
WPF + 高性能异步 MC 协议库,直连三菱 PLC(MC1E/3E/4E)
WPF 启动器 + 动态加载,让分级客户端更新静悄悄

WPF 开源工具搞定 Halcon 授权自动更新,从此每月省心省力

工业相机和算法库太多太杂?这个 WPF 视觉平台把它们统一管起来了

谁说 C# 做不了工业视觉?图像处理、相机标定、色彩识别,三件套全齐

.NET 9 + Vue 3 + Three.js  企业级3D场景管理系统

WinForm 开发工业级 Modbus 数据采集与 HTTP 转发工具

一套开源、可扩展的 WPF + Halcon 工业视觉平台,既好看又实用

轻量强大的 Easy.MessageHub 实现 C# 消息传递,彻底取代传统事件

C# 自动化神器10分钟上手 UI Automation,操控任何 Windows 软件

高性能工业监控系统:ScottPlot 5.0 + Lightning.NET 实现千点数据丝滑滚动

轻量强大的 Easy.MessageHub 实现 C# 消息传递,彻底取代传统事件

别小看 WinForm!一个高颜值工业级仪表盘的完整实现


觉得有收获?不妨分享让更多人受益


收藏
点赞
分享
在看

【声明】内容源于网络
0
0
dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
内容 953
粉丝 0
dotNET跨平台 专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
总阅读15.8k
粉丝0
内容953