直播:PLI 关键帧请求、观众 RTCP 读取、断线自动重连
Made-with: Cursor
This commit is contained in:
@@ -168,9 +168,19 @@ func (h *Hub) attachForwardersToViewerPC(v *viewerSession) {
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if _, err := v.pc.AddTrack(lt); err != nil {
|
||||
rtpSender, err := v.pc.AddTrack(lt)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
// Drain RTCP feedback to keep interceptors/senders healthy.
|
||||
go func() {
|
||||
rtcpBuf := make([]byte, 1500)
|
||||
for {
|
||||
if _, _, e := rtpSender.Read(rtcpBuf); e != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
tf.addViewer(v.id, lt)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,14 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"yh_web/server/handlers"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/pion/rtcp"
|
||||
"github.com/pion/webrtc/v3"
|
||||
)
|
||||
|
||||
@@ -117,6 +119,20 @@ func handlePublisherWS(c *gin.Context, h *Hub) {
|
||||
pc.OnTrack(func(track *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
|
||||
log.Printf("weblive: publisher track kind=%s", track.Kind().String())
|
||||
h.onPublisherTrack(track)
|
||||
if track.Kind() == webrtc.RTPCodecTypeVideo {
|
||||
go func(ssrc uint32) {
|
||||
_ = pc.WriteRTCP([]rtcp.Packet{&rtcp.PictureLossIndication{MediaSSRC: ssrc}})
|
||||
ticker := time.NewTicker(2 * time.Second)
|
||||
defer ticker.Stop()
|
||||
for range ticker.C {
|
||||
st := pc.ConnectionState()
|
||||
if st == webrtc.PeerConnectionStateClosed || st == webrtc.PeerConnectionStateFailed {
|
||||
return
|
||||
}
|
||||
_ = pc.WriteRTCP([]rtcp.Packet{&rtcp.PictureLossIndication{MediaSSRC: ssrc}})
|
||||
}
|
||||
}(uint32(track.SSRC()))
|
||||
}
|
||||
})
|
||||
|
||||
pc.OnConnectionStateChange(func(s webrtc.PeerConnectionState) {
|
||||
|
||||
Reference in New Issue
Block a user