三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

WebRTC生态简介(二):FreeSWITCH、OBS、FFmpeg、mpv、VLC、GStreamer、MediaMTX、nginx-rtmp-module、go2rtc、Oryx

WebRTC生态简介(二):FreeSWITCH、OBS、FFmpeg、mpv、VLC、GStreamer、MediaMTX、nginx-rtmp-module、go2rtc、Oryx

继WebRTC生态简介(一):RTMP、HLS、MPEG-DASH、HTTP-FLV、WHIP、WHEP、RTSP/RTP/RTCP体系、SRS、ZLMediaKit、Janus、MediaSoup。

媒体服务器

FreeSWITCH

推流工具与客户端

OBS Studio

目前最流行的免费开源录屏和直播软件,在GitHub上获得超过38,000颗星标。OBS最初作为Windows平台的录屏工具,后来扩展支持macOS和Linux,成为跨平台的直播解决方案。被广泛应用于游戏直播、在线教育、企业会议、远程协作等场景。

核心功能包括多场景切换、媒体源嵌入、实时滤镜和转码输出。支持多种输入源,包括窗口捕获、屏幕捕获、摄像头、麦克风、图片、文本等。内置丰富滤镜,包括颜色校正、噪点去除、模糊、变换等,无需第三方插件即可实现专业级的画面效果。

OBS在WebRTC生态中的地位尤为重要。2024年发布的OBS 30版本带来对WebRTC的原生支持,用户可直接通过WHIP协议推流到WebRTC服务器,无需RTMP中转。显著降低WebRTC推流的门槛,使得直播延迟降低到200毫秒级别。还支持虚拟摄像头功能,可作为其他应用的视频输入源。

OBS的配置灵活性高,支持高级场景编辑和脚本扩展。提供丰富的第三方插件生态,包括增强的转码滤镜、统计信息显示、多平台同步推流等。OBS还支持NDI(Network Device Interface)协议,可作为专业视频制作系统的输入输出节点。

FFmpeg

音视频处理领域的瑞士军刀,是功能最强大、应用最广泛的命令行工具集。FFmpeg项目由Fabrice Bellard于2000年发起,至今已发展为涵盖编码、解码、转码、流媒体处理等完整功能的工具链。FFmpeg被广泛应用于视频网站、流媒体平台、影视制作等领域,是几乎所有音视频技术栈的基础组件。

FFmpeg的核心组件包括ffmpeg(转码工具)、ffplay(播放器)和ffprobe(分析工具)。ffmpeg可完成音视频格式转换、封装格式转换、编码器切换、缩放、裁剪、滤镜处理等各种操作。ffplay提供基于SDL的简单播放器,可快速测试媒体流。ffprobe可分析媒体文件的元数据、流信息、编码参数等。

在流媒体处理方面,支持几乎所有主流协议的输入输出。可作为推流客户端将本地文件或采集设备推送到RTMP服务器,也可作为拉流客户端录制或转存直播流。还内置简单的服务器功能,可将本地文件或设备通过RTSP、RTMP、HLS等协议对外分发。

FFmpeg的filter_complex功能是其最强大的特性之一,支持链式连接各种音视频滤镜。可实现画面拼接、文字叠加、画中画、时间轴特效等复杂处理。FFmpeg支持数百种编码器,包括H.264/H.265/AV1视频编码和AAC/MP3/Opus音频编码,能够满足各种质量需求。

mpv

官网,基于MPlayer和MPlayer2、开源(GitHub,36.5K Star,3.5K Fork)命令行媒体播放器,以其简洁的设计和强大的性能著称。采用C语言编写,支持GPU加速解码,提供高质量的视频渲染。配置灵活性高,支持脚本扩展,是技术用户和专业玩家的首选播放器。

支持所有常见的音视频格式和协议,包括本地文件和网络流媒体。可通过lavf库支持各种协议,包括RTMP、HLS等流媒体协议。命令行参数丰富,可精细控制播放行为,适合批量处理和自动化脚本。

提供文本配置文件,用户可高度自定义快捷键、滤镜、输出设置等。支持Lua脚本扩展,可实现自动化操作和增强功能。其OSD(On-Screen Display)功能可显示详细的播放信息,便于调试流媒体问题。

VLC

即VLC Media Player简称,官网,VideoLAN开源(GitHub,19.3K Star,6.1K Fork)跨平台多媒体播放器,由法国École Polytechnique大学的学生于1996年发起。

VLC支持几乎所有音视频格式和协议,包括本地文件、网络流、光盘等,是功能最全面的播放器之一。VLC被下载超过30亿次,是世界上最流行的媒体播放器。

核心优势在于其广泛的格式支持和强大的协议能力。可播放本地文件、DVD、CD、VCD、网络流媒体等各种来源的内容。在协议方面,VLC支持RTSP、RTMP、HLS、UDP、TCP等几乎所有流媒体协议,常用于测试服务器发出的流是否正常。还可作为流媒体服务器使用,支持RTSP、HTTP等协议的输出。

VLC的串流功能(Stream)允许用户将本地媒体或设备通过各种协议对外分发。支持转码输出,可在串流的同时进行格式转换。支持节目单(Playlist)功能,可按预设顺序播放多个媒体。这些功能使VLC成为简单的直播或录播解决方案。

支持Windows、macOS、Linux、iOS、Android等全平台,提供统一的用户体验。提供命令行工具cvlc,可在无图形界面的服务器环境使用。VLC的libVLC库可被其他应用集成,提供媒体播放能力。

GStreamer

官网,Linux平台最具影响力的开源(GitHub,3.3K Star,756 Fork)多媒体处理框架。采用插件化架构,提供丰富的音视频处理组件,支持从简单的播放到复杂的转码、流媒体处理等各种场景。许多Linux发行版默认的多媒体框架,也是许多专业应用的基础。

核心概念是管道(Pipeline),由多个元素(Element)串联组成。每个元素负责特定的功能,如数据源、解码器、编码器、过滤器、输出等。开发者可通过编程方式构建管道,实现灵活的多媒体处理流程。GStreamer支持C、C++、Python、Ruby等多种语言的绑定。

在流媒体处理方面功能完善。它支持RTSP、RTP、SRT等协议,可作为客户端或服务器使用。还支持WebRTC的某些功能,但相较于专门的WebRTC服务器实现,其WebRTC支持不够完整。GStreamer被许多专业音视频软件采用,包括Pitivi视频编辑器、Ardour音频工作站等。

转码网关与代理服务器

MediaMTX

官网,原名rtsp-simple-server,功能强大的开源(GitHub,19.8K Star,2.3K Fork)流媒体服务器和网关,采用Go语言编写。支持多种协议的相互转换,包括RTSP、RTMP、HLS、WebRTC、SRT等。

通过单一二进制文件提供所有功能,无需复杂的配置文件,通过命令行参数即可完成配置。支持按需拉流和推流,可作为统一入口访问各种协议的媒体源。

对WebRTC的支持包括WHIP推流和WHEP拉流,可直接与OBS等推流工具对接。还支持录制功能,可将任意协议的流录制为MP4文件。性能表现优秀,资源占用低,适合资源受限的环境。

nginx-rtmp-module

官网,用C开发、最早的开源(GitHub,14K Star,3.6K Fork)RTMP服务器方案之一。Nginx的RTMP模块,为Nginx增加流媒体服务器功能,允许Nginx同时提供HTTP服务和RTMP服务,适合需要Web服务与直播服务共存的场景。

其配置与Nginx的风格一致,简洁明了,支持RTMP推流、拉流、转码、录制等功能。通过与Nginx的其他模块配合,还可实现基于HLS的分发。性能稳定,资源效率高,适合中等规模的直播场景。

但活跃度已大不如前,多年没有重大更新。不支持WebRTC,无法满足新一代低延迟直播的需求。对于新项目,建议考虑SRS、ZLMediaKit、MediaMTX等更现代的方案。

go2rtc

官网,Go语言编写、开源(GitHub,13.9K Star,1.2K Fork)全能型的实时通信和流媒体工具,由俄语区开发者创建和维护。提供统一的流媒体处理框架,支持WebRTC、RTSP、RTMP、FLV、HLS等多种协议,实现各种协议之间的灵活转换。

核心特点是其模块化的架构设计,将不同的协议实现为独立的模块,通过统一的内部流格式进行转换,使得go2rtc可方便地支持新的协议。还提供丰富的客户端库,支持Home Assistant、HomeKit等智能家居平台的集成。

特别适合家庭实验室和小型部署场景,可作为所有摄像头的统一入口,将各种协议的监控摄像头流统一转换为WebRTC或HLS。还支持多流聚合,可将多个源合并为一个流输出。提供Web界面,简洁易用,可方便地查看流状态和管理配置。

Oryx

项目主页,SRS团队推出的一体化、开箱即用、开源(GitHub,875 Star,155 Fork)、视频直播解决方案,将SRS与其他必要组件打包为容器化部署方案,可部署在云上或自建机房,以直播和WebRTC等能力赋能业务。Oryx的名称来源于"oarsman",寓意在直播的海洋中划桨。简化SRS的部署过程,同时提供更丰富的功能。

后端组件包括SRS(流媒体服务器)、FFmpeg(转码)、Prometheus(监控)等,通过Docker Compose进行编排。提供HTTP API进行流管理和控制,支持WebRTC推拉流、RTMP推流、HLS分发等。前端界面简洁直观,可查看流状态、在线人数等信息。

Oryx特别适合快速部署直播服务的场景,可将复杂的多组件系统简化为几次点击即可完成的安装过程。提供Kubernetes部署支持,可扩展到大规模生产环境。

完整平台与解决方案

参考开源视频会议系统:Jitsi Meet、BigBlueButton、La Suite Meet、Galene。

Coturn

开源(GitHub,14.3K Star,2.3K Fork)的STUN/TURN服务器,是WebRTC部署中不可或缺的组件。实现RFC 5766定义的TURN协议,支持UDP、TCP、TLS等多种传输方式。可将媒体数据中继转发,帮助WebRTC客户端在对称型NAT或防火墙环境下建立连接。

部署相对简单,但配置需要一定的网络知识。需要公网IP地址和端口映射才能正常工作。支持多种认证方式,可与WebRTC的信令服务器集成实现动态凭证。支持负载均衡,可部署多实例应对大规模并发。

Coturn的性能直接影响WebRTC的通话质量。在公网环境下,大约10%的WebRTC连接需要TURN中继。部署Coturn是WebRTC生产环境的标准做法。

Ant Media Server

官网,基于Java开发、商业级的实时流媒体平台,支持水平扩展,提供社区版和企业版两个版本。支持WebRTC、RTSP、RTMP、HLS等多种协议,提供低延迟直播、大规模直播、视频会议等多种场景解决方案。

核心优势在于其丰富的功能和企业级支持。提供Adaptive Bitrate(自适应码率)功能,可自动根据观众的网络条件调整视频质量。还支持AI驱动的分析功能,提供观众行为洞察。文档完善,技术支持响应迅速。

企业版提供更多高级功能,包括集群支持、SRT协议、DRM数字版权管理等。在欧美市场有较多企业用户,适合对稳定性和支持有较高要求的场景。

Cloudflare Stream与RealtimeKit

Cloudflare Stream是Cloudflare提供的视频托管和流媒体服务,采用Cloudflare的全球CDN网络。支持上传、转码、存储、分发全流程,开发者可通过API集成视频功能;特点是简单易用,按使用量计费。

Cloudflare RealtimeKit是Cloudflare新推出的实时通信服务,提供SFU能力;完全托管,用户只需关注应用开发。支持WebRTC的接入和分发,可与现有WebRTC应用集成;计费基于参与方分钟数。

Cloudflare的优势在于其全球网络覆盖和与CDN服务的集成。对于已经使用Cloudflare CDN的用户,集成Stream或RealtimeKit可简化架构。

Wowza Streaming Engine

官网,商业级的流媒体服务器软件,提供RTMP、RTSP、HLS、WebRTC等协议支持。流媒体领域的老牌厂商,产品成熟稳定,功能丰富;支持多种部署方式,包括物理服务器、虚拟机、云服务器。

提供丰富的转码、录制、DRM等功能。支持多种CDN集成,可将流分发到Akamai、Cloudflare等全球CDN。还提供Streaming Engine Java API,允许开发者扩展功能。

定价较高,适合有预算的企业用户;提供详细的文档、培训课程和技术支持。还运营着Wowza Streaming Cloud全托管服务,用户无需管理服务器即可使用流媒体功能。

其他

PyMKUI

ZLMediakit官方开源(GitHub,192 Star,44 Fork)、JavaScript和Python编写、现代化前端管理界面,提供直观美观的视频流管理功能,为流媒体服务器的管理和监控提供全新的解决方案。

功能特性:

  • 视频流管理:查看、播放、停止流,获取截图
  • 拉流代理:多备用地址、按需/立即模式、自动故障切换、持久化恢复、在线编辑
  • 转协议预设:保存多套转协议参数,拉流时一键加载,支持加载服务器默认值
  • 观众列表:实时查看每路流的在线观众及连接信息
  • 服务器监控:CPU、内存、磁盘、网络实时图表
  • 服务配置:在线读写ZLMediaKit配置项
  • 在线推流:基于WHIP协议的浏览器端直播推流
  • 网络连接:查看和管理当前所有TCP/UDP会话
  • 录像管理:录像文件分流、分日期浏览,支持检索、在线播放与下载,自动按策略清理过期文件
  • 插件系统:内置可扩展Python事件钩子,支持用户自定义推流鉴权、录制回调、流上下线通知等业务逻辑,无需修改核心代码
  • 视频质量探针:对推拉流实时采样分析,输出码率、帧率、GOP、音视频交织性等多维度质量指标,以折线图与打点图直观呈现,快速定位卡顿、花屏等异常

核心创新

  • Cookie登录模式:解决secret硬编码鉴权的安全风险,用户不再需要在前每次HTTP请求都传递secret密钥明文,而是通过服务器返回的Cookie进行身份验证,大大提高系统安全性。
  1. Python混合编程模式,支持:
    • 使用Python编写ZLMediakit的HTTP API
    • 构建完整的业务系统
    • 实现Python与C++对象级别的交互

技术栈:Tailwind CSS+Font Awesome+原生HTML5视频播放器+Jessibuca(FLV播放)+WHEP(WebRTC播放)

实战

安装前,需确保ZLMediakit服务器已编译安装成功:

gitclone https://github.com/ZLMediaKit/pymkui.gitcdpymkui/backend pipinstall-rrequirements.txt

然后直接打开frontend/login.html,功能界面:

  • 服务器状态:服务器运行状态和资源使用情况
  • 视频管理:查看所有当前活跃的流,包括应用名称、流ID、协议、观众数等信息
  • 流信息查看:查看每个流的详细信息,包括基本信息、源信息、轨道信息等
  • 流播放:直接在浏览器中用各种协议播放视频流
  • 观众列表:显示当前观看流的观众信息
  • 系统设置:管理服务器配置
  • 连接管理:显示所有当前的网络连接
  • 在线推流:在线发起whip推流测试

EchoChat

开源(GitHub,43 Star,15 Fork)跨端可用、可扩展、可演进的实时音视频会议直播系统。支持即时聊天、多人音视频会议、互动直播等核心功能。

技术栈

层级技术说明
前台前端uniapp(Vue3)+mediasoup-client多端适配(H5/App/小程序)
后台管理端Vue3+Vite+ElementPlusPC Web管理后台
后端服务Go(Gin+GORM+Wire+zap)业务逻辑、信令控制
媒体服务Node.js+mediasoupSFU媒体控制与转发
数据库PostgreSQL17持久化数据存储
缓存Redis7实时状态、会话缓存
部署Docker Compose/Nginx容器化部署,预留K8s

采用控制面与媒体面彻底分离的架构设计

客户端 (uniapp / Vue3 管理端) │ WebSocket + HTTP Go 单体服务 (模块化) │ ├── auth 用户认证鉴权 │ ├── im 即时通讯 │ ├── contact 联系人管理 │ ├── meeting 会议控制/信令 │ ├── notify 消息通知 │ └── admin 后台管理 ├── PostgreSQL 持久化数据 ├── Redis 实时状态 │ HTTP mediasoup Node服务 │ IPC mediasoup Worker (C++ SFU)

核心设计思想:控制面与媒体面分离。Go处理所有业务逻辑和信令控制,专注音视频媒体转发,音视频流直连SFU Worker,不经过Go服务。

项目结构:

EchoChat/ ├── frontend/ # 前台用户端:uni-app、Vue 3.4 ├── admin/ # 后台管理端:Vue 3.5、Element Plus ├── backend/ │ └── go-service/ # Go后端服务:Gin、GORM、Wire │ ├── app/ # 业务模块:auth、admin │ ├── cmd/server/ # 服务入口 │ ├── config/ # 配置文件 │ ├── pkg/ # 公共包:db、logs、middleware、utils │ └── router/ # 路由聚合 ├── media-server/ # Node媒体服务 (Phase 3) ├── deploy/ # 部署配置,Docker Compose ├── design-system/ # UI设计系统,ui-ux-pro-max生成 ├── docs/ # 项目文档 │ ├── progress/ # 开发进度 │ ├── plans/ # 实施计划 │ ├── api/ # API接口文档 │ └── architecture/ # 架构设计文档 └── README.md

实战

本地部署

gitclone https://github.com/bojinyuan00/EchoChat.gitcdbackend/go-service go mod tidy go run cmd/server/main.gocdfrontendnpminstall--legacy-peer-depsnpmrun dev:h5cdadminnpminstallnpmrun dev

scripts/目录脚本

脚本用途使用频率
dev-setup.sh首次环境初始化:检查Docker、拉起Postgres/Redis/MinIO、重试式健康检查仅首次clone或重建卷时
start.sh日常启动:秒级拉起全部服务(容器+应用层)每天多次
stop.sh日常停止:优雅终止应用层,默认保留容器每天多次
status.sh状态查看:端口/PID/容器一览排障随时

各服务地址:

服务端口说明
前台用户端(H5)5173http://localhost:5173
后台管理端3100http://localhost:3100
Go后端API8085http://localhost:8085/health健康检查
PostgreSQL5432Docker容器echochat-postgres
Redis6379Docker容器echochat-redis
MinIO API9000对象存储,S3兼容
MinIO Console9001http://localhost:9001,echochat/echochat123456
← 返回列表