Dorisoy.Mediasoup
Dorisoy.Mediasoup 是一个基于 .NET 8 的完整实时音视频通信解决方案,采用 Mediasoup SFU 架构实现高性能的 WebRTC 媒体服务。项目包含 Mediasoup 核心库(C# 实现)、libuv 异步 I/O 绑定、ASP.NET Core 集成中间件、SignalR 信令服务器,以及 WPF 桌面客户端和 Blazor Web 客户端。支持 Open/Pull/Invite 三种服务模式,提供房间管理、音视频采集传输、多端互通等功能。技术栈涵盖 WebRTC、SignalR、SIPSorcery、OpenCvSharp、NAudio 等,适用于在线会议、远程协作、直播互动等场景。
Install / Use
/learn @dorisoy/Dorisoy.MediasoupREADME
Dorisoy.Mediasoup
<div align="center">基于 SFU 架构的开源视频会议系统
</div>Dorisoy.Mediasoup 是一个基于 .NET 8 和 Mediasoup SFU(选择性转发单元)架构的企业级开源视频会议系统。项目采用纯 C# 实现 Mediasoup 核心库,提供 WPF 桌面客户端和 Vue.js Web 客户端,支持低延迟、高并发的实时音视频通信。
系统集成了丰富的协作功能:协同白板、实时投票、同步转译、屏幕截图标注、即时聊天等,是构建在线会议、远程协作、在线教育、直播互动等场景的理想选择。
商业版下载地址:https://shop.unitos.cn/item/3
核心优势
| 特性 | 描述 | |------|------| | SFU 架构 | 采用 Mediasoup 选择性转发,服务器仅转发媒体流,客户端承担编解码,大幅降低服务器负载 | | 多编解码器 | 支持 VP8、VP9(默认)、H.264,VP9 可节省 30% 带宽,H.264 支持硬件加速 | | 多端互通 | WPF 桌面端 + Vue.js Web 端无缝互通,统一 SignalR 信令协议 | | 灵活服务模式 | Open(开放)、Pull(按需)、Invite(邀请)三种模式适配不同会议场景 | | 丰富协作工具 | 内置白板、投票、翻译、截图、聊天等协作功能,开箱即用 | | 纯 C# 实现 | Mediasoup 核心库纯 C# 实现,与 .NET 生态无缝集成 |
屏幕截图
<img src="https://github.com/dorisoy/Dorisoy.Mediasoup/blob/main/screen/1.png"/> <img src="https://github.com/dorisoy/Dorisoy.Mediasoup/blob/main/screen/2.png"/> <img src="https://github.com/dorisoy/Dorisoy.Mediasoup/blob/main/screen/3.png"/> <img src="https://github.com/dorisoy/Dorisoy.Mediasoup/blob/main/screen/4.png"/>功能特性
音视频通信
| 功能 | 描述 | |------|------| | 实时音视频 | 低延迟、高质量的音视频采集、编码、传输和渲染 | | 多编解码器 | VP8、VP9(默认)、H.264 视频编解码,Opus 音频编解码 | | 屏幕共享 | 支持全屏、窗口、区域共享,可共享系统音频 | | 活跃发言者 | 基于音频级别的发言者识别和高亮显示 | | 摄像头切换 | 支持多摄像头切换和分辨率调整 |
协作工具
| 功能 | 描述 | |------|------| | 协同白板 | 支持画笔、矩形、椭圆、文字、橡皮擦、选择等工具,实时同步绘制 | | 实时投票 | 主持人创建投票,参与者实时投票,结果即时统计展示 | | 同步转译 | 语音识别 + 多语言翻译,实时生成字幕,支持保存转录内容 | | 屏幕截图 | 选区截图 + 内置标注工具(画笔、矩形、椭圆、箭头、文字),自动复制到剪贴板 | | 协同编辑器 | 多人实时协同文档编辑 |
即时通讯
| 功能 | 描述 | |------|------| | 群聊/私聊 | 支持房间群聊和一对一私聊 | | 多媒体消息 | 支持文本、图片、文件、表情消息 | | 表情反应 | 会中表情反馈,带音效的表情动画 | | 未读提醒 | 智能未读消息计数和提醒 |
会议管理
| 功能 | 描述 | |------|------| | 房间管理 | 创建/加入/离开房间,完整生命周期管理 | | 成员管理 | 查看在线成员,踢出用户,禁言控制 | | 主持人权限 | 邀请发言、关闭媒体流、发起投票等主持人专属功能 | | JWT 认证 | 安全的用户身份验证和授权机制 |
解决方案架构
Dorisoy.Mediasoup.sln
│
├── src/ # 源代码目录
│ │
│ ├── Dorisoy.Mediasoup/ # [核心库] Mediasoup SFU C# 实现
│ │ ├── Router/ # 路由器 - 管理 Transport、Producer、Consumer
│ │ ├── Transport/ # 传输层抽象基类
│ │ ├── WebRtcTransport/ # WebRTC 传输实现
│ │ ├── PlainTransport/ # Plain RTP 传输(用于 FFmpeg/GStreamer)
│ │ ├── PipeTransport/ # 管道传输(用于路由器间通信)
│ │ ├── DirectTransport/ # 直接传输
│ │ ├── Producer/ # 媒体生产者
│ │ ├── Consumer/ # 媒体消费者
│ │ ├── DataProducer/ # 数据通道生产者
│ │ ├── DataConsumer/ # 数据通道消费者
│ │ ├── Worker/ # Worker 进程管理
│ │ ├── Channel/ # 与原生 worker 的通信通道
│ │ ├── WebRtcServer/ # WebRTC 服务器(端口复用)
│ │ ├── RtpObserver/ # RTP 观察者基类
│ │ ├── AudioLevelObserver/ # 音频级别观察者
│ │ ├── ActiveSpeakerObserver/ # 活跃发言者观察者
│ │ ├── Settings/ # 配置设置类
│ │ ├── ORTC/ # ORTC 能力协商
│ │ ├── MediasoupServer.cs # 服务器入口类
│ │ └── MediasoupOptions.cs # 配置选项
│ │
│ ├── Dorisoy.Libuv/ # [底层库] libuv 异步 I/O 的 .NET 绑定
│ │ └── src/ # TCP/UDP/Pipe 异步通信实现
│ │
│ ├── Dorisoy.Mediasoup.Common/ # [共享库] 公共模型和工具
│ │ ├── ClientRequest/ # 客户端请求模型(21个)
│ │ ├── RtpParameters/ # RTP 参数定义
│ │ ├── SctpParameters/ # SCTP 参数定义
│ │ ├── FBS/ # FlatBuffers 序列化定义(28个子目录)
│ │ ├── EventEmitter/ # 事件发射器实现
│ │ ├── H264ProfileLevelId/ # H.264 配置解析
│ │ ├── ScalabilityMode/ # 可伸缩模式解析
│ │ └── Constants/ # 常量定义
│ │
│ ├── Dorisoy.Mediasoup.AspNetCore/ # [集成库] ASP.NET Core 集成中间件
│ │ └── Microsoft/Extensions/ # DI 扩展方法
│ │
│ ├── Dorisoy.Meeting.Server/ # [服务端] 会议信令服务器
│ │ ├── SignalR/ # SignalR Hub 和服务
│ │ │ ├── MeetingHub.cs # 会议 Hub(1400+ 行核心逻辑)
│ │ │ ├── Models/ # 消息通知模型
│ │ │ └── Services/ # Hub 相关服务
│ │ ├── Models/ # 业务模型(11个)
│ │ ├── Authorization/ # JWT 认证和授权
│ │ ├── Settings/ # 服务器配置
│ │ ├── Exceptions/ # 自定义异常(6个)
│ │ ├── Room.cs # 房间管理(音频观察、成员管理)
│ │ ├── Peer.cs # Peer 管理(Transport/Producer/Consumer)
│ │ ├── Scheduler.cs # 调度器(房间创建、成员加入离开)
│ │ └── ServeMode.cs # 三种服务模式枚举
│ │
│ ├── Dorisoy.Meeting.Web/ # [Web后端] ASP.NET Core 应用
│ │ ├── Controllers/ # REST API 控制器
│ │ ├── Startup.cs # 应用配置(认证、CORS、Mediasoup)
│ │ ├── Program.cs # 应用入口
│ │ ├── mediasoupsettings.json # Mediasoup 详细配置
│ │ ├── appsettings.json # 应用配置
│ │ ├── dtls-cert.pem / dtls-key.pem # DTLS 证书
│ │ └── wwwroot/ # 静态文件
│ │
│ ├── Dorisoy.Meeting.Client/ # [桌面端] WPF 客户端
│ │ ├── WebRtc/ # WebRTC 实现
│ │ │ ├── MediasoupDevice.cs # Mediasoup 设备封装
│ │ │ ├── MediasoupTransport.cs # 传输层实现(55KB 核心)
│ │ │ ├── MediasoupSdpBuilder.cs # SDP 构建器
│ │ │ ├── AudioEncoders.cs # 音频编码器(Opus/PCMA)
│ │ │ ├── VideoEncoders.cs # 视频编码器(VP8/H264)
│ │ │ ├── VideoDecoders.cs # 视频解码器
│ │ │ ├── RtpMediaDecoder.cs # RTP 媒体解码
│ │ │ └── FFmpegConfig.cs # FFmpeg 配置
│ │ ├── Services/ # 服务层
│ │ │ ├── SignalRService.cs # SignalR 通信服务
│ │ │ └── WebRtcService.cs # WebRTC 服务
│ │ ├── ViewModels/ # MVVM 视图模型
│ │ ├── Models/ # 数据模型
│ │ ├── Views/ # 视图控件
│ │ ├── Converters/ # 值转换器
│ │ ├── Helpers/ # 工具类
│ │ ├── MainWindow.xaml # 主窗口(31KB 完整 UI)
│ │ └── App.xaml.cs # 应用入口和 DI 配置
│ │
│ ├── Dorisoy.Meeting.Web.Client/ # [Web前端] Vue.js 客户端
│ │ ├── src/
│ │ │ ├── App.vue # 主应用组件(40KB 完整实现)
│ │ │ ├── lib/ # 依赖库
│ │ │ └── assets/ # 静态资源
│ │ ├── package.json # NPM 依赖配置
│ │ └── vite.config.js # Vite 构建配置
│ │
│ ├── Dorisoy.Utils/ # [工具库] 通用工具
│ │ ├── Extensions/ # 扩展方法(21个)
│ │ ├── Cryptography/ # 加密工具
│ │ ├── Json/ # JSON 序列化工具
│ │ └── Models/ # 通用模型
│ │
│ └── Dorisoy.Mediasoup.Runtimes.Builder/ # [构建工具] 原生运行时构建脚本
│ ├── build_nuget.ps1 # Windows 构建脚本
│ └── build_nuget.sh # Linux/macOS 构建脚本
│
└── tools/TokenGenerator/ # Token 生成工具
└── Program.cs # JWT Token 生成器
技术栈
后端技术
| 技术 | 版本 | 用途 | |------|------|------| | .NET | 8.0 | 运行时框架 | | ASP.NET Core | 8.0 | Web 框架 | | SignalR | 8.0 | 实时双向通信、信令服务 | | Mediasoup | 3.15.7 | SFU 媒体服务器 | | FlatBuffers | - | 高效序列化 | | Serilog | - | 结构化日志 |
客户端技术
| 技术 | 用途 | |------|------| | WPF + Wpf.Ui | 桌面客户端 UI 框架(Fluent Design) | | SIPSorcery | .NET WebRTC 实现 | | NAudio | 音频采集和处理 | | OpenCvSharp | 视频采集和处理 | | FFmpeg | 视频编解码(VP8/VP9/H264) | | CommunityToolkit.Mvvm | MVVM 框架 | | Vue.js 3 | Web 前端框架 | | mediasoup-client | 浏览器 WebRTC 客户端 |
支持的编解码器
| 类型 | 编解码器 | 说明 | |------|---------|------| | 视频 | VP9(默认) | 高压缩率,节省 30% 带宽 | | 视频 | VP8 | 兼容性好 | | 视频 | H.264 | 硬件加速支持 | | 音频 | Opus (48kHz) | 高质量立体声 |
三种服务模式
系统支持三种不同的会议服务模式,适配不同场景需求:
1. Open 模式(开放模式)
适用场景:自由会议、开放讨论、小型团队协作
| 特点 | 说明 | |------|------| | 自动推流 | 用户进入后立即开始推流 | | 自动消费 | 自动消费房间内其他用户的媒体流 | | 持续推流 | 媒体流即使无人消费也不会自动停止 |
2. Pull 模式(拉取模式)
适用场景:大型会议、按需观看、节省带宽
| 特点 | 说明 | |------|------| | 按需拉取 | 用户主动选择要拉取的媒体流 | | 按需推流 | 触发其他用户推流 | | 自动停流 | 无人消费时自动停止推流,节省带宽 |
3. Invite 模式(邀请模式)
适用场景:正式会议、课堂教学、大型直播
| 特点 | 说明 | |------|------| | 主持人邀请 | 仅主持人可邀请用户推流 | | 申请审批 | 用户可申请推流,需主持人同意 | | 集中管控 | 主持人可关闭任意用户的媒体流 |
系统架构
┌─────────────────────────────────────────────────────────────────────┐
│ Client Layer │
├─────────────────────────────────┬───────────────────────────────────┤
│ WPF Desktop Client │ Vue.js Web Client │
│ ┌───────────────────────────┐ │ ┌───────
