libdatachannel は、POSIX プラットフォーム (GNU/Linux、Android、FreeBSD、Apple macOS、iOS を含む) および Microsoft Windows 用の C バインディングを備えた C++17 での WebRTC データ チャネル、WebRTC メディア トランスポート、および WebSocket のスタンドアロン実装です。 WebRTC は、2 つのデバイス間でのリアルタイムのピアツーピア データおよびメディア交換を可能にする W3C および IETF 標準です。
このライブラリは、外部への依存関係を最小限に抑え、単純かつ軽量であることを目指しており、Google の肥大化した参照ライブラリをインポートする手間をかけずに、ネイティブ アプリケーションと Web ブラウザ間の直接接続を可能にします。このインターフェイスは、クロス環境アプリケーションの設計を容易にするために、ブラウザーに存在する 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) を介して 2 つのデバイス間でリアルタイムのデータとメディアの交換が可能になります。ブラウザ Firefox、Chromium、Safari、およびその他の WebRTC ライブラリと互換性があります (webrtc-echoes を参照)。メディア トランスポートはオプションであり、コンパイル時に無効にすることができます。
プロトコルスタック:
特徴:
メディア多重化では SDP BUNDLE モードのみがサポートされていることに注意してください (RFC8843)。この動作は JSEP バンドルのみのポリシーと同等です。ライブラリは常に 1 つの固有のネットワーク コンポーネントをネゴシエートします。このコンポーネントでは、SRTP メディア ストリームが SRTCP 制御パケット (RFC5761) および SCTP/DTLS データ トラフィック (RFC8261) と多重化されます。
WebSocket は、WebRTC シグナリングに最適なプロトコルです。このサポートはオプションであり、コンパイル時に無効にすることができます。
プロトコルスタック:
特徴:
この作品をスポンサーしてくださった Streamr、Vagon、Shiguredo、Deon Botha、Michael Cho に感謝します。