前言
一个基于 .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(音频)等主流编解码器。
技术栈
后端技术
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
客户端技术
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
支持的编解码器
|
|
|
|---|---|
|
|
|
|
|
|
三种服务模式详解
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
视频质量档位
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最大客户端数量(SFU 出站带宽 ≈ N×(N−1)×bitrate)
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VP9 节省约 30% 带宽;H264 支持硬件加速,CPU 负载最低
推荐配置方案
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ 超过 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部署
作者:小码编匠

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 实现千点数据丝滑滚动
觉得有收获?不妨分享让更多人受益

