The MediaEngine defines the codecs and RTP capabilities supported by a PeerConnection. It controls which audio and video codecs are negotiated, which RTP header extensions are enabled, and which RTCP feedback mechanisms are available.
By default, Pion WebRTC includes a comprehensive set of codecs. You only need to configure the MediaEngine if you want to customize codec support or add custom header extensions.
You can limit header extensions to specific transceiver directions:
directional-extensions.go
// Only use for sendingm.RegisterHeaderExtension( webrtc.RTPHeaderExtensionCapability{URI: sdp.TransportCCURI}, webrtc.RTPCodecTypeVideo, webrtc.RTPTransceiverDirectionSendonly,)// Only use for receivingm.RegisterHeaderExtension( webrtc.RTPHeaderExtensionCapability{URI: sdp.AudioLevelURI}, webrtc.RTPCodecTypeAudio, webrtc.RTPTransceiverDirectionRecvonly,)
m := &webrtc.MediaEngine{}m.RegisterDefaultCodecs()// Add additional feedback to all video codecsm.RegisterFeedback( webrtc.RTCPFeedback{Type: "ccm", Parameter: "fir"}, webrtc.RTPCodecTypeVideo,)// Add NACK to all audio codecsm.RegisterFeedback( webrtc.RTCPFeedback{Type: "nack"}, webrtc.RTPCodecTypeAudio,)
By default, the MediaEngine is copied for each PeerConnection. You can disable this:
disable-copy.go
s := webrtc.SettingEngine{}// Allow modifying MediaEngine after PeerConnection creations.DisableMediaEngineCopy(true)m := &webrtc.MediaEngine{}m.RegisterDefaultCodecs()api := webrtc.NewAPI( webrtc.WithMediaEngine(m), webrtc.WithSettingEngine(s),)peerConnection, _ := api.NewPeerConnection(webrtc.Configuration{})// Now you can modify m after creation// Warning: Don't share MediaEngine between PeerConnections!
When disabling MediaEngine copy, do not share the same MediaEngine instance between multiple PeerConnections.
// After signaling is complete, you can query what was negotiatedcodecs := m.getCodecsByKind(webrtc.RTPCodecTypeVideo)for _, codec := range codecs { fmt.Printf("Negotiated: %s (PT: %d)\n", codec.MimeType, codec.PayloadType)}