Delphi RTCPeerConnection

Delphi/C++ Builder から WebRTC を使用できます。接続性のための ICE、鍵交換ハンドシェイクのための DTLS、メディアのための SRTP、データチャネルのための SCTP-over-DTLS を提供します。ブラウザは不要です。

TsgcRTCPeerConnection

ネイティブ Delphi WebRTC ピアです。内蔵の ICE、DTLS、SRTP、SCTP スタックをベースに W3C RTCPeerConnection インターフェース(CreateOffer / CreateAnswer / SetRemoteDescription / AddIceCandidate / DataChannel)を実装しています。

コンポーネントクラス

TsgcRTCPeerConnection

プロトコル

WebRTC (W3C)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

コンポーネント自体は Enterprise、offer と answer、DataChannel、メディアトラックにはさらに sgcWebRTC パックが必要です。どちらも All-Access に含まれます。

sgcVer.inc の Enterprise ブロックは SGC_ICESGC_DTLSSGC_RTCPEERCONNECTIONSGC_TURN を定義します。これが TsgcRTCPeerConnection をパレットに載せ、ICE と TURN のトランスポートを与えます。offer と answer のメソッド、DataChannel API、メディア API は SGC_SDPSGC_DATACHANNELSGC_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;
}

実例: 2 つの Delphi アプリケーションをエンドツーエンドで

主な機能

ICE、DTLS、SRTP、SCTP を 1 つのコンポーネントに統合したネイティブ WebRTC ピアです。W3C RTCPeerConnection API を実装しています。

SDP オファー / アンサー

CreateOfferCreateAnswer は、適切な ICE-UFRAG / ICE-PWD / FINGERPRINT / SETUP 属性を持つ RFC 8866 SDP を生成します。SetRemoteDescription がピアの SDP を取り込みます。

ICE による接続性

候補収集と接続確認に内部で TsgcICEClient を使用します。AddIceCandidate がシグナリングからトリクルされたリモート候補を受け付けます。

DTLS 鍵交換

選択された ICE ペアが書き込み可能になると、コンポーネントは DTLS ハンドシェイク(RFC 6347)を実行し、RFC 5764 の EXTRACTOR-dtls_srtp ラベルで SRTP 鍵材料をエクスポートします。RTCOptions.DTLS の既定値は False で、CreateDataChannel が代わりに有効化します。

データチャネル(SCTP-over-DTLS)

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) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

Delphi で WebRTC を使い始めませんか?

体験版をダウンロードして、Delphi アプリケーションにネイティブな RTCPeerConnection を追加してください。