BUNDLE
Also written a=group:BUNDLE, bundled media, BUNDLE group
Running every m= section of a session over a single ICE transport, so one port, one DTLS handshake and one TURN allocation carry all the media.
Without BUNDLE, a call with audio, video and a data channel negotiates three separate transports. Three ICE sessions, three sets of candidates, three DTLS handshakes, three TURN allocations to pay for.
BUNDLE collapses them. The offerer lists the m= sections it wants multiplexed in a=group:BUNDLE, the first of them becomes the tagged m= section, and its transport carries everything. The receiver pulls the streams apart again using payload types, SSRCs, and the MID carried in an RTP header extension.
This is why almost nothing in modern WebRTC is per m= section any more. Connection state, DTLS state and the selected candidate pair all belong to the bundle group, not to the media line.
RFC 9143 obsoleted RFC 8843, so older references you find will point at the wrong document number even though the mechanism is the same.
Read more
- WebRTC bitrate stuck low? maxBitrate is only a ceilingYou set maxBitrate to 2.5 Mbps and WebRTC sends 700 kbps. The congestion controller picks the rate. How GCC decides, and which getStats fields show why.
- WebRTC DTLS handshake failed: how to find out whyICE says connected, then connectionState goes to failed. That is the DTLS handshake, and RTCDtlsTransport's error event names the exact cause.