Delphi RTCPeerConnection
Delphi/C++ Builder から WebRTC を使用できます。接続性のための ICE、鍵交換ハンドシェイクのための DTLS、メディアのための SRTP、データチャネルのための SCTP-over-DTLS を提供します。ブラウザは不要です。
Delphi/C++ Builder から WebRTC を使用できます。接続性のための ICE、鍵交換ハンドシェイクのための DTLS、メディアのための SRTP、データチャネルのための SCTP-over-DTLS を提供します。ブラウザは不要です。
ネイティブ Delphi WebRTC ピアです。内蔵の ICE、DTLS、SRTP、SCTP スタックをベースに W3C RTCPeerConnection インターフェース(CreateOffer / CreateAnswer / SetRemoteDescription / AddIceCandidate / DataChannel)を実装しています。
TsgcRTCPeerConnection
Windows, macOS, Linux, iOS, Android
コンポーネント自体は Enterprise、offer と answer、DataChannel、メディアトラックにはさらに sgcWebRTC パックが必要です。どちらも All-Access に含まれます。
sgcVer.inc の Enterprise ブロックは SGC_ICE、SGC_DTLS、SGC_RTCPEERCONNECTION、SGC_TURN を定義します。これが TsgcRTCPeerConnection をパレットに載せ、ICE と TURN のトランスポートを与えます。offer と answer のメソッド、DataChannel API、メディア API は SGC_SDP、SGC_DATACHANNEL、SGC_RTP の内側にあり、それらを定義するのは SGC_PACK_WEBRTC だけです。したがって Enterprise に加えて sgcWebRTC パック、またはそのパックを最初から有効にする All-Access が必要です。
RTCOptions.ICEServers を設定し、CreateOffer を呼び、OnLocalDescription が渡してくる SDP をシグナリングチャネルでリモートピアへ送り、戻ってきた answer を設定すれば、データ経路が開通します。
uses
sgcP2P, sgcP2P_DataChannel;
// TFormPeer は FPeer、FChannel、FIncoming: TStringList とハンドラを保持
procedure TFormPeer.CreatePeer;
begin
FPeer := TsgcRTCPeerConnection.Create(nil);
FPeer.RTCOptions.ICEServers.AddURL('stun:stun.l.google.com:19302');
FPeer.RTCOptions.ICE.TURN := False; // TURN サーバーはまだ無し
FPeer.OnLocalDescription := OnLocalDescription;
FPeer.OnDataChannel := OnDataChannel;
// 発信側。CreateDataChannel が RTCOptions.DTLS を有効にする
FChannel := FPeer.CreateDataChannel('chat');
FChannel.OnMessage := OnChannelMessage;
FPeer.CreateOffer;
end;
procedure TFormPeer.OnLocalDescription(Sender: TObject;
const aType, aSDP: string);
begin
// aType は 'offer' または 'answer'
SignalToPeer(aType, aSDP); // WebSocket シグナリングチャネル経由で送信
end;
procedure TFormPeer.OnDataChannel(Sender: TObject;
aChannel: TsgcRTCDataChannel);
begin
FChannel := aChannel;
FChannel.OnMessage := OnChannelMessage;
end;
procedure TFormPeer.OnChannelMessage(Sender: TObject;
const aText: string);
begin
// ワーカースレッドで発火するので、コントロールに触れる前にマーシャリングする
FIncoming.Add(aText);
end;
// includes: sgcP2P.hpp, sgcP2P_DataChannel.hpp
TsgcRTCPeerConnection *Peer = new TsgcRTCPeerConnection(this);
Peer->RTCOptions->ICEServers->AddURL("stun:stun.l.google.com:19302");
Peer->RTCOptions->ICE->TURN = false; // TURN サーバーはまだ無し
Peer->OnLocalDescription = OnLocalDescription;
Peer->OnDataChannel = OnDataChannel;
TsgcRTCDataChannel *Channel = Peer->CreateDataChannel("chat");
Peer->CreateOffer();
void __fastcall TFormPeer::OnLocalDescription(TObject *Sender,
const String aType, const String aSDP)
{
SignalToPeer(aType, aSDP); // WebSocket シグナリングチャネル経由で送信
}
void __fastcall TFormPeer::OnDataChannel(TObject *Sender,
TsgcRTCDataChannel *aChannel)
{
aChannel->OnMessage = OnChannelMessage;
}
ICE、DTLS、SRTP、SCTP を 1 つのコンポーネントに統合したネイティブ WebRTC ピアです。W3C RTCPeerConnection API を実装しています。
CreateOffer と CreateAnswer は、適切な ICE-UFRAG / ICE-PWD / FINGERPRINT / SETUP 属性を持つ RFC 8866 SDP を生成します。SetRemoteDescription がピアの SDP を取り込みます。
候補収集と接続確認に内部で TsgcICEClient を使用します。AddIceCandidate がシグナリングからトリクルされたリモート候補を受け付けます。
選択された ICE ペアが書き込み可能になると、コンポーネントは DTLS ハンドシェイク(RFC 6347)を実行し、RFC 5764 の EXTRACTOR-dtls_srtp ラベルで SRTP 鍵材料をエクスポートします。RTCOptions.DTLS の既定値は False で、CreateDataChannel が代わりに有効化します。
CreateDataChannel は DTLS 上で多重化された SCTP ストリームを開きます。信頼性あり / 部分的信頼性あり、順序あり / 順序なし、BufferedAmount によるバックプレッシャーをサポートします。
AddTrack が音声または映像のトラックを送出し、OnTrack がリモートのトラックを受け取ります。いずれも SRTP 上を流れます。付属の TsgcWSPServer_RTCPeerConnection は WebSocket シグナリングのブローカーで、発信側と着信側を結び付け、双方の SDP と候補を中継します。
ブラウザの RTCPeerConnection と相互接続できます。Chromium / Firefox / Safari でテスト済みです。同じ SDP セマンティクス、ICE 候補、データチャネルのワイヤーフォーマットを使用します。
このコンポーネントが実装するプロトコルの公式ソースです。
コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。
| オンラインヘルプ — TsgcRTCPeerConnection このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。 | 開く | |
| デモプロジェクト — Demos\35.P2P\05.RTCPeerConnection すぐに実行できるサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。 | 開く | |
| 技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。 | 開く | |
| ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。 | 開く |