sgcWebRTC 功能矩阵 — 音频、视频、数据通道 | eSeGeCe

sgcWebRTC 功能矩阵

sgcWebRTC 为 TsgcRTCPeerConnection 添加的一切功能,按能力分类列出。信令和连接来自 sgcWebSockets Enterprise 中的基础组件;本附加包在此基础上解锁了媒体引擎 — 音频、视频、屏幕捕获、数据通道、加密和带宽评估。每项能力在 Delphi 和 C++ Builder 中的行为完全一致,每份许可证均附带完整源代码。

信令

Enterprise 基础组件与 SDP

音频

Opus / G.711

视频

VP8 / H.264 / MJPEG

数据通道

RFC 8831 / 8832

屏幕共享

捕获与渲染

SRTP / DTLS

加密媒体

带宽评估

拥塞控制

Enterprise 自带的功能,以及 sgcWebRTC 添加的功能

基础连接能力已经内置于 sgcWebSockets 中。sgcWebRTC 在同一个组件上解锁了 SDP、数据通道和媒体接口。

能力随附于说明
STUN 客户端(TsgcSTUNClientsgcWebSockets Standard服务器反射候选地址发现,Enterprise 以下版本即可使用。
TURN 客户端与服务器、ICE 客户端(TsgcTURNClientTsgcICEClientsgcWebSockets Enterprise中继候选地址以及完整的 ICE 候选收集 / 提名。
基础 TsgcRTCPeerConnection、传统的 WebSocket 中继信令sgcWebSockets EnterpriseGatherCandidatesWriteData 以及 OnRTCWebSocket… / OnRTCCandidatePairNominated / OnRTCConnect 事件通过内置的 RTCPeerConnection 协议服务器驱动 ICE 连接和 DTLS 传输,不含 SDP、数据通道或媒体。
手动 SDP offer/answer 信令sgcWebRTCCreateOfferCreateAnswerSetLocalDescriptionSetRemoteDescriptionAddIceCandidateRestartIce — 浏览器所期望的 JSEP(RFC 8829)状态机。
重新协商与冲突处理sgcWebRTCAddTrack / RemoveTrack 之后的重新 offer、OnNegotiationNeeded、回滚,以及通过 Polite 实现的 W3C 完美协商规则。
涓流式 ICEsgcWebRTCTrickleICERTCOptions.TrickleICEAuto 会在候选地址被发现时立即流式发送,而不是等待完整的收集超时。
连接与信令状态sgcWebRTCConnectionState(W3C RTCPeerConnectionState 子集)和 SignalingState(RTCSignalingState 子集),以及 OnConnectionStateChangeOnError
SCTP 数据通道、RTP 音视频、SRTP 加密sgcWebRTC参见下方各节 — 这三项功能都需要在 Enterprise 基础组件之上安装本附加包。

Opus 和 G.711 音频轨道

一次 AddTrack 调用即可为对等连接附加一个音频轨道;PCM 数据进,RTP 数据出,远端轨道的路径与之相反。

能力成员说明
附加一个音频轨道AddTrack(rtctkAudio, aCodec)返回一个 TsgcRTCTrackRemoveTrack 停止发送该轨道。
Opus 编解码器cctAudioOpus48 kHz / 立体声,通过动态加载的 libopus 绑定实现。
G.711 编解码器cctAudioPCMU / cctAudioPCMA8 kHz / 单声道 μ-law 和 A-law,始终可用,无需外部库。
发送采集到的音频TsgcRTCTrack.SendPCM(aPCM, aSamplesPerChannel)按编码器的采样率和声道数排列的 16 位有符号交错 PCM。
接收解码后的音频OnAudio(aPCM, aSampleRate, aChannels, aSamplesPerChannel)在远端轨道的 RTP 数据到达并解码时触发。
编码器 / 解码器访问AudioEncoder / AudioDecoder底层的 TsgcAudioEncoderBase / TsgcAudioDecoderBase 对象,可按轨道替换。
轨道生命周期EnabledEndedOnEndedEnabled := False 可在不重新协商的情况下静音;Ended 反映轨道被远端丢弃或重新 offer 的情况。
麦克风采集TsgcMediaCaptureSource 派生类各平台的原生采集(Windows 上为 waveIn,另有 Linux、Apple 和 Android 后端)直接向 SendPCM 提供数据。

VP8、H.264 和 Motion JPEG 视频轨道

视频的工作方式与音频相同 — 帧数据进,RTP 数据出 — 编解码器按轨道选择,对于 H.264,底层使用平台自身的硬件编码器。

能力成员说明
附加一个视频轨道AddTrack(rtctkVideo, aCodec)与音频相同的调用,使用视频用的 TsgcCodecType
VP8 编解码器cctVideoVP8动态加载的 libvpx 绑定,适用于 Windows 和 Linux。
H.264 编解码器cctVideoH264各平台的原生硬件编码器:Media Foundation(Windows)、VideoToolbox(iOS/macOS)、MediaCodec(Android)。Annex-B 码流,RFC 6184 负载封装,SPS/PPS 在每个关键帧上随流携带。
Motion JPEG 编解码器cctVideoJPEG基于 GDI+,适用于 Windows 和 Delphi XE 及更高版本。
发送原始帧TsgcRTCTrack.SendVideoFrame(aFrame, aForceKeyFrame)编码并发送一个 TsgcVideoFrame(I420/NV12/RGB/BGR 系列)。
发送预先编码的帧SendEncodedFrame(aData, aIsKeyFrame)为已在外部编码好的帧绕过轨道自身的编码器。
接收解码 / 原始帧OnVideoFrame / OnEncodedFrame已解码的 TsgcVideoFrame,或带有关键帧标志的原始编码码流。
请求关键帧RequestKeyFrame向远端发送方发送一个 RTCP PLI。
编码器 / 解码器访问VideoEncoder / VideoDecoder底层的 TsgcVideoEncoderBase / TsgcVideoDecoderBase 对象。
摄像头采集TsgcMediaCaptureSource 派生类各平台的采集后端(Windows、Linux、Apple、Android)直接向 SendVideoFrame 提供数据。
渲染TsgcMediaRenderer 派生类各平台的渲染后端(Windows、Linux、Apple、Android),用于呈现已解码的远端视频。

SCTP 数据通道(RFC 8831 / 8832)

有序或无序、完全可靠或受重传次数/生存期限制,全部基于 SCTP-over-DTLS 实现。

能力成员说明
打开一个通道CreateDataChannel(aLabel, aOrdered, aMaxRetransmits, aMaxPacketLifeTime, aProtocol)返回一个 TsgcRTCDataChannel;会强制开启 RTCOptions.DTLS
远端打开的通道OnDataChannel(aChannel)当对端在此连接上打开一个通道时触发。
发送文本 / 二进制数据Send(aText) / SendBytes(aBytes)如果通道尚未打开则返回 False
接收OnMessage(aText) / OnMessageBinary(aBytes)在驱动 SCTP 的线程上触发。
生命周期事件OnOpenOnCloseOnError(aError)与 W3C RTCDataChannel 生命周期一致。
通道状态StateHasIdIdSCTP 流 ID 只有在 DTLS 角色确定之后才最终确定(RFC 8832 奇偶性)。
流量控制BufferedAmountMaxMessageSizeMaxMessageSize 跟踪对端自身的 a=max-message-size,并在本地拒绝超大发送。
可靠性内省ReliabilityReliabilityParamOrderedMaxRetransmitsMaxPacketLifeTime准确读回该通道所协商的参数。
关闭Close基于 RE-CONFIG 的关闭;State 依次变为 closing,然后 closed 并触发 OnClose
对等连接层级DataChannelCountDataChannels[i]枚举该连接上所有已打开的通道。

桌面、显示器、窗口和区域捕获

捕获源与摄像头使用同一条 SendVideoFrame 路径 — 屏幕内容只是另一种视频轨道。

能力成员说明
捕获后端TsgcScreenCapture_Win基于 GDI 的桌面、显示器、窗口和区域捕获。目前仅限 Windows。
枚举显示器GetMonitors / MonitorIndex每台显示器一行(分辨率、位置、主显示器标志);-1 捕获整个虚拟桌面。
区域捕获Region屏幕坐标矩形;空矩形会禁用区域模式。
分层 / 透明窗口CaptureLayered使用 CAPTUREBLT,从而包含分层和透明窗口。
光标IncludeCursor将鼠标光标绘制到捕获的帧中。
降采样MaxWidth0 表示禁用降采样;否则更宽的帧会在编码前被缩小。
帧率捕获源的 FrameRate默认 5 fps,屏幕内容最高可达 30 fps。
编码并发送TsgcRTCTrack.SendVideoFrame捕获到的 BGRA32 帧像其他来源一样送入该轨道的视频编码器。

强制媒体加密

从 DTLS 握手开始,连接上的每个 RTP、RTCP 和 SCTP 数据包都会被加密 — 不存在明文模式。

能力详情
密钥交换在已提名的 ICE 候选对上进行 DTLS 握手(RFC 5764 DTLS-SRTP),推导出 SRTP 密钥材料。
DTLS 角色在手动信令中,角色来自 a=setup(offer 方为 passive,answer 方为 active);角色确定后 IsDTLSClient 会报告该角色。
SRTP 保护配置SRTP_AES128_CM_SHA1_80SRTP_AES128_CM_SHA1_32SRTP_AEAD_AES_128_GCMSRTP_AEAD_AES_256_GCM,在 DTLS 握手期间协商。
按 SSRC 划分的加密状态按照 RFC 3711 3.2.3 节的要求,每个 SSRC 各持有一个独立的加密上下文(翻转计数器、重放窗口),即使 BUNDLE 将每条 m-line 都放到同一个 DTLS-SRTP 传输上也是如此。
覆盖范围涵盖 RTP/RTCP 媒体以及承载数据通道的 SCTP 关联 — 覆盖整个连接,而不仅仅是某一条 m-line。
后端基于 OpenSSL 的 SRTP 实现。

拥塞控制与丢包抗性

一个类似 Google Congestion Control 风格的基于延迟的估算器持续跟踪链路状况,并驱动视频编码器的目标码率。

能力成员说明
基于延迟的估算器TsgcBWE_Estimator以 5 ms 为单位对发送突发数据分组,对组间延迟运行趋势线滤波,并将链路状态分类为正常、过载或欠载。
速率控制AIMD 控制器过载时降至已确认速率的 85%,欠载时保持不变,正常时提升(远离上一次已知上限时为倍增,接近上限时为加性增长)。
丢包上限丢包率跟踪丢包率超过 10% 时上限下降;低于 2% 时每秒恢复 8%,直至 MaxBitrate
全传输反馈TWCC(RTCP)BuildRTCP_TWCC / ParseRTCP_TWCC 全传输拥塞控制反馈,对只支持 REMB 的对端则以 REMB 作为回退上限。
开启方式RTCOptions.Media.CongestionControl只有当远端描述也协商了匹配的头部扩展 / 反馈机制时才会生效。
丢包恢复RTCOptions.Media.RTX收到 RTCP NACK 时按 RFC 4588 对视频流进行重传。
前向纠错RTCOptions.Media.FEC对发出的视频流进行 RED / ULPFEC 保护。
发送节奏控制RTCOptions.Media.Pacing按估算码率对发出的视频数据包进行节奏控制,而不是集中突发发送。
关键帧恢复RTCP PLI接收端轨道上的 RequestKeyFrame 会在丢包后向发送方请求一个新的关键帧。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

用 sgcWebRTC 构建

下载免费试用版,开始在 Delphi 或 C++ Builder 中打开一个真正的对等连接。