icey:C++20 实时媒体栈
基于 C++20 的模块化实时媒体工具包,整合 WebRTC、FFmpeg 与异步网络,供开发者自建音视频传输与中继服务。
- 浏览
- 2
- 访问
- 0
- 下载
- 0
- 版本
- v2.5.3
详细介绍
项目简介
icey 是一个模块化的 C++20 实时媒体工具包,把 FFmpeg、libuv、OpenSSL、llhttp、libdatachannel、Symple、STUN、TURN 收进同一套运行时模型,覆盖采集、编码、传输、信令与中继。
它把自己定位为 libWebRTC 的轻量替代:用 CMake 构建,构建时间以分钟计;SSL 使用 OpenSSL;媒体编解码交给 FFmpeg(任意编解码器);信令用内置的 Symple,中继用内置的 RFC 5766 TURN 服务器。核心第三方代码由 CMake 自动拉取,系统级的 TLS 与媒体依赖自动探测。
除 C++ 库本身,还提供 Rust 绑定:icey 是安全封装,icey-sys 是覆盖 C ABI 的 bindgen 层。
主要功能
- PacketStream 管线:Source → Processor → Sink 的显式图结构。接入采集源、串联处理器、挂上输出端即可;管线负责背压、丢帧与拆除。借用包在首次入队或保留适配器之前保持零拷贝,这条边界在图里是显式的。
- WebRTC 收发:摄像头经 H.264 编码与 WebRTC 传输推到浏览器(README 称约 150 行 C++);浏览器推流到服务端由 FFmpeg 解码落盘(约 130 行);也可把 MP4 文件实时转成 WebRTC 流,并附带数据通道做控制消息。
- 内置 TURN 中继:生产可用的 RFC 5766 TURN 服务器,支持 channel binding 与 TCP,用于穿透对称 NAT。
- HTTP / WebSocket:基于 libuv + llhttp,README 给出的单核微 VM 基准为 keep-alive 下 72,209 req/s、1.43ms 延迟,高于 Go 1.25 net/http 与 Node.js v20。
- 信令:Symple v4,通过 WebSocket 提供鉴权、在线状态、房间与呼叫协议(init / accept / offer / answer / candidate)。
- 解码分支可扩展:解码后的数据可接入
vision、speech处理器,而不改变传输路径。 - 构建集成:支持 CMake FetchContent、
find_package,以及 Conan、vcpkg、Arch、Homebrew、Debian 等打包配方。
安装与使用
环境要求:Linux 需 GCC 12+ 或 Clang 15+,macOS 需 AppleClang 15+(Xcode 15+),Windows 需 MSVC 2022;CMake 3.21+,Linux/macOS 还需 pkg-config。
从源码构建:
git clone https://github.com/auscaster/icey.git
cd icey
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON
cmake --build build --parallel $(nproc)
ctest --test-dir build --output-on-failure
在其他 CMake 项目中引入:
include(FetchContent)
FetchContent_Declare(icey
GIT_REPOSITORY https://github.com/auscaster/icey.git
GIT_TAG 2.5.3
)
FetchContent_MakeAvailable(icey)
target_link_libraries(myapp PRIVATE icey::base icey::net icey::http)
也可以用 find_package(icey REQUIRED) 引入已安装的版本。
典型用法是构造一条 PacketStream,把采集源、编码器和网络输出依次挂上去:
PacketStream stream;
stream.attachSource(videoCapture);
stream.attach(new av::MultiplexPacketEncoder(opts), 5);
stream.attach(socket, 10);
stream.start();
其他示例(webcam-streamer、media-recorder、file-streamer、turnserver)位于仓库的 src/webrtc/samples/ 与 src/turn/samples/ 目录下。
想从零最快看到浏览器画面,README 建议直接使用独立的 auscaster/icey-server 仓库提供的镜像,启动后打开 http://localhost:4500,在 icey 节点上点 Watch。
注意事项
- 项目使用 LGPL-2.1 许可证,商用集成前请确认合规要求。
- 系统依赖 OpenSSL 3.x、FFmpeg 5+/6+/7+、OpenCV 3.0+ 会被自动探测;构建
webrtc模块时会自动拉取 libdatachannel,首次构建需要网络。 - 自 2.5.3 起,构建机 CPU 调优改为可选,默认发布的二进制针对基线目标 CPU,便于在更多机器上直接运行。
- 仓库里检入的打包文件是打 tag 前的模板,应基于针对已发布归档渲染出的配方来构建。
本作品整理自 GitHub 开源项目 auscaster/icey,原作者 @auscaster,许可证 LGPL-2.1。中文介绍由 AI 根据项目 README 整理,以原仓库为准。
更新记录
- v2.5.3当前版本
将构建机 CPU 调优改为可选,使默认发布二进制可在基线目标 CPU 上运行;修复渲染带 tag 的 openSUSE 配方时对 auscaster 主页的校验。
评论