libdatachannel 是 C++17 中 WebRTC 数据通道、WebRTC 媒体传输和 WebSocket 的独立实现,具有适用于 POSIX 平台(包括 GNU/Linux、Android、FreeBSD、Apple macOS 和 iOS)和 Microsoft Windows 的 C 绑定。 WebRTC 是 W3C 和 IETF 标准,可在两个设备之间实现实时点对点数据和媒体交换。
该库的目标是既简单又轻量级,具有最小的外部依赖性,以实现本机应用程序和网络浏览器之间的直接连接,而无需导入 Google 臃肿的参考库。该界面由浏览器中存在的 JavaScript WebRTC 和 WebSocket API 的简化版本组成,以简化跨环境应用程序的设计。
它可以用多个后端进行编译:
WebRTC 堆栈与 Firefox 和 Chromium 等浏览器完全兼容,请参阅下面的兼容性。此外,使用库中的数据通道和 WebSocket 的代码可以按原样编译为具有 datachannel-wasm 的浏览器的 WebAssembly。
libdatachannel 自版本 0.18 起已在 MPL 2.0 下获得许可,请参阅许可证(以前的版本在 LGPLv2.1 或更高版本下获得许可)。
libdatachannel 可在 AUR、vcpkg 和 FreeBSD 端口上使用。绑定可用于 Rust 和 Node.js。
请参阅 BUILDING.md 了解构建说明。
有关信令服务器的完整使用示例(在 MPL 2.0 下),请参阅示例。
此外,您可能想查看 C API 文档。
# include " rtc/rtc.hpp "
rtc::Configuration config;
config.iceServers.emplace_back( " mystunserver.org:3478 " );
rtc::PeerConnection pc (config);
pc.onLocalDescription([](rtc::Description sdp) {
// Send the SDP to the remote peer
MY_SEND_DESCRIPTION_TO_REMOTE ( std::string (sdp));
});
pc.onLocalCandidate([](rtc::Candidate candidate) {
// Send the candidate to the remote peer
MY_SEND_CANDIDATE_TO_REMOTE (candidate. candidate (), candidate. mid ());
});
MY_ON_RECV_DESCRIPTION_FROM_REMOTE ([&pc](std::string sdp) {
pc. setRemoteDescription ( rtc::Description (sdp));
});
MY_ON_RECV_CANDIDATE_FROM_REMOTE ([&pc](std::string candidate, std::string mid) {
pc. addRemoteCandidate ( rtc::Candidate (candidate, mid));
});
pc.onStateChange([](rtc::PeerConnection::State state) {
std::cout << " State: " << state << std::endl;
});
pc.onGatheringStateChange([](rtc::PeerConnection::GatheringState state) {
std::cout << " Gathering state: " << state << std::endl;
});
auto dc = pc.createDataChannel( " test " );
dc-> onOpen ([]() {
std::cout << " Open " << std::endl;
});
dc-> onMessage ([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " Received: " << get<rtc::string>(message) << std::endl;
}
});
std::shared_ptr<rtc::DataChannel> dc;
pc.onDataChannel([&dc](std::shared_ptr<rtc::DataChannel> incoming) {
dc = incoming;
dc-> send ( " Hello world! " );
});
rtc::WebSocket ws;
ws.onOpen([]() {
std::cout << " WebSocket open " << std::endl;
});
ws.onMessage([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " WebSocket received: " << std::get<rtc::string>(message) << endl;
}
});
ws.open( " wss://my.websocket/service " );
该库实现了以下通信协议:
WebRTC 允许通过对等连接(或 RTCPeerConnection)在两个设备之间进行实时数据和媒体交换,这是一种可以承载数据通道和媒体轨道的信号对等连接。它与 Firefox、Chromium 和 Safari 浏览器以及其他 WebRTC 库兼容(请参阅 webrtc-echoes)。媒体传输是可选的,可以在编译时禁用。
协议栈:
特征:
请注意,媒体多路复用仅支持 SDP BUNDLE 模式 (RFC8843)。该行为相当于 JSEP 仅捆绑策略:该库始终协商一个唯一的网络组件,其中 SRTP 媒体流与 SRTCP 控制数据包 (RFC5761) 和 SCTP/DTLS 数据流量 (RFC8261) 复用。
WebSocket 是 WebRTC 信号传输的首选协议。该支持是可选的,可以在编译时禁用。
协议栈:
特征:
感谢 Streamr、Vagon、Shiguredo、Deon Botha 和 Michael Cho 对这项工作的赞助!