From bbe39aeb1391ae643fe816245cefe0036b31e398 Mon Sep 17 00:00:00 2001 From: ZSC714725 Date: Fri, 15 Dec 2023 09:26:04 +0800 Subject: [PATCH 1/3] lalmax support safari hevc(whep) --- rtc/packer.go | 153 +++++++++++++++++++++++++++++++++++++++++++-- rtc/server.go | 6 ++ rtc/whepsession.go | 28 ++++++++- 3 files changed, 178 insertions(+), 9 deletions(-) diff --git a/rtc/packer.go b/rtc/packer.go index facaad0..ec35bbb 100644 --- a/rtc/packer.go +++ b/rtc/packer.go @@ -2,15 +2,24 @@ package rtc import ( "fmt" + "math/rand" "github.com/pion/rtp" - "github.com/pion/webrtc/v3" "github.com/q191201771/lal/pkg/avc" "github.com/q191201771/lal/pkg/base" + "github.com/q191201771/lal/pkg/hevc" "github.com/q191201771/lal/pkg/rtprtcp" "github.com/q191201771/naza/pkg/nazalog" ) +const ( + PacketH264 = "H264" + PacketHEVC = "HEVC" + PacketSafariHevc = "SafariHevc" + PacketPCMA = "PCMA" + PacketPCMU = "PCMU" +) + type Packer struct { enc IRtpEncoder } @@ -19,12 +28,14 @@ func NewPacker(mimeType string, codec []byte) *Packer { p := &Packer{} switch mimeType { - case webrtc.MimeTypeH264: + case PacketH264: p.enc = NewH264RtpEncoder(codec) - case webrtc.MimeTypePCMA: + case PacketPCMA: p.enc = NewG711RtpEncoder(8) - case webrtc.MimeTypePCMU: + case PacketPCMU: p.enc = NewG711RtpEncoder(0) + case PacketSafariHevc: + p.enc = NewSafariHEVCRtpEncoder(codec) } return p } @@ -108,7 +119,7 @@ func (enc *H264RtpEncoder) Encode(msg base.RtmpMsg) ([]*rtp.Packet, error) { pkts = append(pkts, &newRtpPkt) } - if len(rtpPkts) == 0 { + if len(pkts) == 0 { return nil, fmt.Errorf("Packetize failed") } @@ -148,9 +159,139 @@ func (enc *G711RtpEncoder) Encode(msg base.RtmpMsg) ([]*rtp.Packet, error) { pkts = append(pkts, &newRtpPkt) } - if len(rtpPkts) == 0 { + if len(pkts) == 0 { + return nil, fmt.Errorf("Packetize failed") + } + + return pkts, nil +} + +type SafariHEVCRtpEncoder struct { + IRtpEncoder + vps []byte + sps []byte + pps []byte + payloadType int + ssrc int + seqId uint16 + tsBase int64 +} + +func NewSafariHEVCRtpEncoder(codec []byte) *SafariHEVCRtpEncoder { + vps, sps, pps, err := hevc.ParseVpsSpsPpsFromSeqHeader(codec) + if err != nil { + nazalog.Error(err) + return nil + } + + return &SafariHEVCRtpEncoder{ + vps: vps, + sps: sps, + pps: pps, + payloadType: 98, + ssrc: 0, + seqId: uint16(rand.Int() % 65536), + tsBase: -1, + } +} + +func (enc *SafariHEVCRtpEncoder) Encode(msg base.RtmpMsg) ([]*rtp.Packet, error) { + var pkts []*rtp.Packet + var out []byte + var keyFrame bool + + if enc.tsBase == -1 { + enc.tsBase = int64(msg.Dts()) + } + + err := avc.IterateNaluAvcc(msg.Payload[5:], func(nal []byte) { + t := hevc.ParseNaluType(nal[0]) + if t == hevc.NaluTypeSei { + return + } + + if hevc.IsIrapNalu(t) { + keyFrame = true + out = append(out, avc.NaluStartCode3...) + out = append(out, enc.vps...) + out = append(out, avc.NaluStartCode3...) + out = append(out, enc.sps...) + out = append(out, avc.NaluStartCode3...) + out = append(out, enc.pps...) + } + + out = append(out, avc.NaluStartCode3...) + out = append(out, nal...) + }) + + if err != nil { + return nil, fmt.Errorf("Packetize failed") + } + + if len(out) == 0 { + return nil, fmt.Errorf("Packetize failed") + } + + payloads := enc.doPacketNaluForSafariHevc(out, keyFrame) + for i, payload := range payloads { + var pkt rtp.Packet + pkt.Version = 2 + pkt.Timestamp = uint32((int64(msg.Dts()) - enc.tsBase) * 90) + pkt.PayloadType = uint8(enc.payloadType) + pkt.SSRC = uint32(enc.ssrc) + + if i == len(payloads)-1 { + pkt.Marker = true + } + + pkt.SequenceNumber = enc.seqId + enc.seqId += 1 + pkt.Payload = payload + + pkts = append(pkts, &pkt) + } + + if len(pkts) == 0 { return nil, fmt.Errorf("Packetize failed") } return pkts, nil } + +func (enc *SafariHEVCRtpEncoder) doPacketNaluForSafariHevc(nalu []byte, keyFrame bool) [][]byte { + var rtpPayloads [][]byte + + naluLen := len(nalu) + maxPayloadSize := 1200 + splitNum := naluLen/maxPayloadSize + 1 + remainder := naluLen % splitNum + referenceLen := naluLen / splitNum + dataPos := 0 + + for i := splitNum; i > 0; i-- { + tmpLen := referenceLen + if i < remainder { + tmpLen++ + } + buf := make([]byte, tmpLen+1) + if keyFrame { + if i == splitNum { + buf[0] = 3 + } else { + buf[0] = 1 + } + } else { + if i == splitNum { + buf[0] = 2 + } else { + buf[0] = 0 + } + } + copy(buf[1:], nalu[dataPos:dataPos+tmpLen]) + dataPos += tmpLen + + rtpPayloads = append(rtpPayloads, buf) + } + + return rtpPayloads +} diff --git a/rtc/server.go b/rtc/server.go index cef88f7..3ece4af 100644 --- a/rtc/server.go +++ b/rtc/server.go @@ -4,6 +4,7 @@ import ( config "lalmax/conf" "net" "net/http" + "strings" "github.com/gin-gonic/gin" "github.com/pion/ice/v2" @@ -140,6 +141,11 @@ func (s *RtcServer) HandleWHEP(c *gin.Context) { return } + userAgent := c.Request.UserAgent() + if strings.Contains(userAgent, "Safari") { + whepsession.SetRemoteSafari(true) + } + sdp := whepsession.GetAnswerSDP(string(body)) if sdp == "" { c.Status(http.StatusInternalServerError) diff --git a/rtc/whepsession.go b/rtc/whepsession.go index 3df548c..a850601 100644 --- a/rtc/whepsession.go +++ b/rtc/whepsession.go @@ -21,6 +21,7 @@ type whepSession struct { audiopacker *Packer msgChan chan base.RtmpMsg closeChan chan bool + remoteSafari bool } func NewWhepSession(streamid string, pc *peerConnection, lalServer logic.ILalServer) *whepSession { @@ -41,6 +42,10 @@ func NewWhepSession(streamid string, pc *peerConnection, lalServer logic.ILalSer } } +func (conn *whepSession) SetRemoteSafari(val bool) { + conn.remoteSafari = val +} + func (conn *whepSession) GetAnswerSDP(offer string) (sdp string) { var err error @@ -59,7 +64,24 @@ func (conn *whepSession) GetAnswerSDP(offer string) (sdp string) { return } - conn.videopacker = NewPacker(webrtc.MimeTypeH264, videoHeader.Payload) + conn.videopacker = NewPacker(PacketH264, videoHeader.Payload) + } else if videoHeader.IsHevcKeySeqHeader() { + if conn.remoteSafari { + // hevc暂时只支持对接Safari hevc + conn.videoTrack, err = webrtc.NewTrackLocalStaticRTP(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH265}, "video", "lalmax") + if err != nil { + nazalog.Error(err) + return + } + + _, err = conn.pc.AddTrack(conn.videoTrack) + if err != nil { + nazalog.Error(err) + return + } + + conn.videopacker = NewPacker(PacketSafariHevc, videoHeader.Payload) + } } } @@ -75,7 +97,7 @@ func (conn *whepSession) GetAnswerSDP(offer string) (sdp string) { return } - mimeType = webrtc.MimeTypePCMA + mimeType = PacketPCMA case base.RtmpSoundFormatG711U: conn.audioTrack, err = webrtc.NewTrackLocalStaticRTP(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypePCMU}, "audio", "lalmax") if err != nil { @@ -83,7 +105,7 @@ func (conn *whepSession) GetAnswerSDP(offer string) (sdp string) { return } - mimeType = webrtc.MimeTypePCMU + mimeType = PacketPCMU default: nazalog.Error("unsupport audio codeid:", audioId) } From e74cf6a732f14aa7d672b60cebfcd802723aade4 Mon Sep 17 00:00:00 2001 From: ZSC714725 Date: Fri, 15 Dec 2023 09:54:08 +0800 Subject: [PATCH 2/3] lalmax support safari hevc(whep) --- go.mod | 24 ++++++++++++------------ go.sum | 37 +++++++++++++++++++++++++++++++++++++ rtc/peerConnection.go | 10 ++++++++++ 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index e54fd42..fc9b203 100644 --- a/go.mod +++ b/go.mod @@ -11,10 +11,10 @@ require ( github.com/ghettovoice/gosip v0.0.0-20230802091127-d58873a3fe44 github.com/gin-gonic/gin v1.9.1 github.com/gofrs/uuid v4.4.0+incompatible - github.com/pion/ice/v2 v2.3.6 - github.com/pion/interceptor v0.1.17 - github.com/pion/rtp v1.8.1 - github.com/pion/webrtc/v3 v3.2.8 + github.com/pion/ice/v2 v2.3.11 + github.com/pion/interceptor v0.1.25 + github.com/pion/rtp v1.8.3 + github.com/pion/webrtc/v3 v3.2.23 github.com/q191201771/lal v0.36.7 github.com/q191201771/naza v0.30.48 github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b @@ -45,7 +45,7 @@ require ( github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.1.0-rc.1 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/juju/errors v0.0.0-20220331221717-b38fca44723b // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect @@ -60,15 +60,15 @@ require ( github.com/pion/datachannel v1.5.5 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.7 // indirect + github.com/pion/mdns v0.0.8 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.10 // indirect - github.com/pion/sctp v1.8.7 // indirect + github.com/pion/rtcp v1.2.12 // indirect + github.com/pion/sctp v1.8.8 // indirect github.com/pion/sdp/v3 v3.0.6 // indirect - github.com/pion/srtp/v2 v2.0.15 // indirect - github.com/pion/stun v0.6.0 // indirect - github.com/pion/transport/v2 v2.2.1 // indirect - github.com/pion/turn/v2 v2.1.0 // indirect + github.com/pion/srtp/v2 v2.0.18 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.3 // indirect + github.com/pion/turn/v2 v2.1.3 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rs/zerolog v1.26.1 // indirect github.com/sirupsen/logrus v1.4.2 // indirect diff --git a/go.sum b/go.sum index dd55109..126b7ef 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -153,29 +155,46 @@ github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/ice/v2 v2.3.6 h1:Jgqw36cAud47iD+N6rNX225uHvrgWtAlHfVyOQc3Heg= github.com/pion/ice/v2 v2.3.6/go.mod h1:9/TzKDRwBVAPsC+YOrKH/e3xDrubeTRACU9/sHQarsU= +github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw= +github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E= github.com/pion/interceptor v0.1.17 h1:prJtgwFh/gB8zMqGZoOgJPHivOwVAp61i2aG61Du/1w= github.com/pion/interceptor v0.1.17/go.mod h1:SY8kpmfVBvrbUzvj2bsXz7OJt5JvmVNZ+4Kjq7FcwrI= +github.com/pion/interceptor v0.1.25 h1:pwY9r7P6ToQ3+IF0bajN0xmk/fNw/suTgaTdlwTDmhc= +github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.7 h1:P0UB4Sr6xDWEox0kTVxF0LmQihtCbSAdW0H2nEgkA3U= github.com/pion/mdns v0.0.7/go.mod h1:4iP2UbeFhLI/vWju/bw6ZfwjJzk0z8DNValjGxR/dD8= +github.com/pion/mdns v0.0.8 h1:HhicWIg7OX5PVilyBO6plhMetInbzkVJAhbdJiAeVaI= +github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.10 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc= github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= +github.com/pion/rtcp v1.2.12 h1:bKWiX93XKgDZENEXCijvHRU/wRifm6JV5DGcH6twtSM= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.7.13/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.8.1 h1:26OxTc6lKg/qLSGir5agLyj0QKaOv8OP5wps2SFnVNQ= github.com/pion/rtp v1.8.1/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.3 h1:VEHxqzSVQxCkKDSHro5/4IUUG1ea+MFdqR2R3xSpNU8= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= github.com/pion/sctp v1.8.7 h1:JnABvFakZueGAn4KU/4PSKg+GWbF6QWbKTWZOSGJjXw= github.com/pion/sctp v1.8.7/go.mod h1:g1Ul+ARqZq5JEmoFy87Q/4CePtKnTJ1QCL9dBBdN6AU= +github.com/pion/sctp v1.8.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U= +github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= github.com/pion/srtp/v2 v2.0.15 h1:+tqRtXGsGwHC0G0IUIAzRmdkHvriF79IHVfZGfHrQoA= github.com/pion/srtp/v2 v2.0.15/go.mod h1:b/pQOlDrbB0HEH5EUAQXzSYxikFbNcNuKmF8tM0hCtw= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.4.0/go.mod h1:QPsh1/SbXASntw3zkkrIk3ZJVKz4saBY2G7S10P3wCw= github.com/pion/stun v0.6.0 h1:JHT/2iyGDPrFWE8NNC15wnddBN8KifsEDw8swQmrEmU= github.com/pion/stun v0.6.0/go.mod h1:HPqcfoeqQn9cuaet7AOmB5e5xkObu9DwBdurwLKO9oA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40= github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= @@ -184,11 +203,19 @@ github.com/pion/transport/v2 v2.1.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlD github.com/pion/transport/v2 v2.2.0/go.mod h1:AdSw4YBZVDkZm8fpoz+fclXyQwANWmZAlDuQdctTThQ= github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3 h1:XcOE3/x41HOSKbl1BfyY1TF1dERx7lVvlMCbXU7kfvA= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/turn/v2 v2.1.0 h1:5wGHSgGhJhP/RpabkUb/T9PdsAjkGLS6toYz5HNzoSI= github.com/pion/turn/v2 v2.1.0/go.mod h1:yrT5XbXSGX1VFSF31A3c1kCNB5bBZgk/uu5LET162qs= +github.com/pion/turn/v2 v2.1.3 h1:pYxTVWG2gpC97opdRc5IGsQ1lJ9O/IlNhkzj7MMrGAA= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/udp/v2 v2.0.1/go.mod h1:B7uvTMP00lzWdyMr/1PVZXtV3wpPIxBRd4Wl6AksXn8= github.com/pion/webrtc/v3 v3.2.8 h1:RmDEz7wjK3k0sAuCSMptfxp095pBYSkSSm5ySiJYIHI= github.com/pion/webrtc/v3 v3.2.8/go.mod h1:6/7wF1P86AQAw4iTmKIgdzaevaQ8qh9SfrFyypqmN6w= +github.com/pion/webrtc/v3 v3.2.23 h1:GbqEuxBbVLFhXk0GwxKAoaIJYiEa9TyoZPEZC+2HZxM= +github.com/pion/webrtc/v3 v3.2.23/go.mod h1:1CaT2fcZzZ6VZA+O1i9yK2DU4EOcXVvSbWG9pr5jefs= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.4.0/go.mod h1:NWz/XGvpEW1FyYQ7fCx4dqYBLlfTcE+A9FLAkNKqjFE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -249,6 +276,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -272,6 +301,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -309,6 +340,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -319,6 +352,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -331,6 +366,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/rtc/peerConnection.go b/rtc/peerConnection.go index e23690f..bb7850f 100644 --- a/rtc/peerConnection.go +++ b/rtc/peerConnection.go @@ -50,6 +50,16 @@ func newPeerConnection(ips []string, iceUDPMux ice.UDPMux, iceTCPMux ice.TCPMux) return } + err = mediaEngine.RegisterCodec( + webrtc.RTPCodecParameters{ + RTPCodecCapability: webrtc.RTPCodecCapability{ + MimeType: webrtc.MimeTypeH265, + ClockRate: 90000, + }, + PayloadType: 102, + }, + webrtc.RTPCodecTypeVideo) + // TODO opus音频 // PCMU From 4b9bdd5a35e2c1c6f57ee39d5735cea12d8ce3e4 Mon Sep 17 00:00:00 2001 From: ZSC714725 Date: Fri, 15 Dec 2023 09:55:19 +0800 Subject: [PATCH 3/3] lalmax support safari hevc(whep) --- rtc/peerConnection.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtc/peerConnection.go b/rtc/peerConnection.go index bb7850f..d3f2b70 100644 --- a/rtc/peerConnection.go +++ b/rtc/peerConnection.go @@ -60,6 +60,11 @@ func newPeerConnection(ips []string, iceUDPMux ice.UDPMux, iceTCPMux ice.TCPMux) }, webrtc.RTPCodecTypeVideo) + if err != nil { + nazalog.Error(err) + return + } + // TODO opus音频 // PCMU