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 對這項工作的贊助!