Delphi RTCPeerConnection
在 Delphi/C++Builder 中使用 WebRTC — ICE 负责连接,DTLS 负责密钥握手,SRTP 负责媒体,SCTP-over-DTLS 负责 DataChannel。无需浏览器。
在 Delphi/C++Builder 中使用 WebRTC — ICE 负责连接,DTLS 负责密钥握手,SRTP 负责媒体,SCTP-over-DTLS 负责 DataChannel。无需浏览器。
原生 Delphi WebRTC 对等端 — 镜像 W3C RTCPeerConnection 接口(CreateOffer / CreateAnswer / SetRemoteDescription / AddIceCandidate / DataChannel),由捆绑的 ICE、DTLS、SRTP 和 SCTP 栈支撑。
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 捆绑到单个组件的原生 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 候选、相同的 DataChannel 线格式。
本组件所实现协议的权威来源。