代码拉取完成,页面将自动刷新
package engine
import (
"github.com/pion/ice/v2"
log "github.com/pion/ion-log"
"github.com/pion/webrtc/v3"
)
// Transport is pub/sub transport
type Transport struct {
api *webrtc.DataChannel
signal *Signal
pc *webrtc.PeerConnection
role int
config WebRTCTransportConfig
SendCandidates []*webrtc.ICECandidate
RecvCandidates []webrtc.ICECandidateInit
}
// NewTransport create a transport
func NewTransportByMedia(role int, signal *Signal, cfg WebRTCTransportConfig, me *webrtc.MediaEngine) *Transport {
t := &Transport{
role: role,
signal: signal,
config: cfg,
}
var err error
var api *webrtc.API
cfg.Setting.SetICEMulticastDNSMode(ice.MulticastDNSModeDisabled)
/*
var me *webrtc.MediaEngine
cfg.Setting.SetICEMulticastDNSMode(ice.MulticastDNSModeDisabled)
if role == PUBLISHER {
me, err = getPublisherMediaEngine(cfg.VideoMime)
} else {
me, err = getSubscriberMediaEngine()
}
api = webrtc.NewAPI(webrtc.WithMediaEngine(me), webrtc.WithSettingEngine(cfg.Setting))
*/
api = webrtc.NewAPI(webrtc.WithMediaEngine(me), webrtc.WithSettingEngine(cfg.Setting))
t.pc, err = api.NewPeerConnection(cfg.Configuration)
if err != nil {
log.Errorf("NewPeerConnection error: %v", err)
return nil
}
if role == PUBLISHER {
_, err = t.pc.CreateDataChannel(API_CHANNEL, &webrtc.DataChannelInit{})
if err != nil {
log.Errorf("error creating data channel: %v", err)
return nil
}
}
t.pc.OnICECandidate(func(c *webrtc.ICECandidate) {
if c == nil {
// Gathering done
log.Infof("gather candidate done")
return
}
//append before join session success
if t.pc.CurrentRemoteDescription() == nil {
t.SendCandidates = append(t.SendCandidates, c)
} else {
for _, cand := range t.SendCandidates {
t.signal.Trickle(cand, role)
}
t.SendCandidates = []*webrtc.ICECandidate{}
t.signal.Trickle(c, role)
}
})
return t
}
// NewTransport create a transport
func NewTransport(role int, signal *Signal, cfg WebRTCTransportConfig) *Transport {
t := &Transport{
role: role,
signal: signal,
config: cfg,
}
var err error
var api *webrtc.API
var me *webrtc.MediaEngine
cfg.Setting.SetICEMulticastDNSMode(ice.MulticastDNSModeDisabled)
if role == PUBLISHER {
me, err = getPublisherMediaEngine(cfg.VideoMime)
} else {
me, err = getSubscriberMediaEngine()
}
api = webrtc.NewAPI(webrtc.WithMediaEngine(me), webrtc.WithSettingEngine(cfg.Setting))
t.pc, err = api.NewPeerConnection(cfg.Configuration)
if err != nil {
log.Errorf("NewPeerConnection error: %v", err)
return nil
}
if role == PUBLISHER {
_, err = t.pc.CreateDataChannel(API_CHANNEL, &webrtc.DataChannelInit{})
if err != nil {
log.Errorf("error creating data channel: %v", err)
return nil
}
}
t.pc.OnICECandidate(func(c *webrtc.ICECandidate) {
if c == nil {
// Gathering done
log.Infof("gather candidate done")
return
}
//append before join session success
if t.pc.CurrentRemoteDescription() == nil {
t.SendCandidates = append(t.SendCandidates, c)
} else {
for _, cand := range t.SendCandidates {
t.signal.Trickle(cand, role)
}
t.SendCandidates = []*webrtc.ICECandidate{}
t.signal.Trickle(c, role)
}
})
return t
}
func (t *Transport) GetPeerConnection() *webrtc.PeerConnection {
return t.pc
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。