Delphi RTCPeerConnection

在 Delphi/C++Builder 中使用 WebRTC — ICE 负责连接,DTLS 负责密钥握手,SRTP 负责媒体,SCTP-over-DTLS 负责 DataChannel。无需浏览器。

TsgcRTCPeerConnection

原生 Delphi WebRTC 对等端 — 镜像 W3C RTCPeerConnection 接口(CreateOffer / CreateAnswer / SetRemoteDescription / AddIceCandidate / DataChannel),由捆绑的 ICE、DTLS、SRTP 和 SCTP 栈支撑。

组件类

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;
}

完整示例:两个 Delphi 应用端到端

内部功能

将 ICE、DTLS、SRTP 和 SCTP 捆绑到单个组件的原生 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 会替你打开它。

DataChannel(SCTP-over-DTLS)

CreateDataChannel 打开多路复用在 DTLS 上的 SCTP 流 — 可靠/部分可靠、有序/无序,通过 BufferedAmount 实现背压。

媒体轨道

AddTrack 发布音频或视频轨道,OnTrack 接收远端轨道,两者都走 SRTP。配套的 TsgcWSPServer_RTCPeerConnection 是 WebSocket 信令代理:它把主叫与被叫配对,并转发双方的 SDP 与候选地址。

浏览器兼容

与浏览器 RTCPeerConnection 互操作 — 已针对 Chromium / Firefox / Safari 测试。相同的 SDP 语义、相同的 ICE 候选、相同的 DataChannel 线格式。

规范与参考

本组件所实现协议的权威来源。

文档与演示

直达组件参考,获取可立即运行的演示项目,并下载试用版。

在线帮助 — TsgcRTCPeerConnection 本组件的完整属性、方法和事件参考。
演示项目 — Demos\35.P2P\05.RTCPeerConnection 可立即运行的示例项目,随 sgcWebSockets 包一起提供 — 请从下方下载试用版。
技术文档 (PDF) 仅涵盖本组件的功能、快速入门、Delphi 和 C++ Builder 代码示例及主要参考来源。
用户手册 (PDF) 涵盖库中每个组件的综合手册。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好在 Delphi 中运行 WebRTC 了吗?

下载免费试用版,为您的 Delphi 应用程序添加原生 RTCPeerConnection。