52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package weblive
|
||
|
||
import (
|
||
"encoding/json"
|
||
"os"
|
||
"strings"
|
||
|
||
"github.com/pion/webrtc/v3"
|
||
)
|
||
|
||
// MediaEngine 与 API 构建(全局复用,避免重复注册编解码器)
|
||
// 部署在 Docker/NAT 后若观众端黑屏、信令正常,请设置 LIVE_PUBLIC_IP 为本机公网 IPv4(与域名解析一致,可逗号分隔多个)。
|
||
func buildAPI() (*webrtc.API, error) {
|
||
m := &webrtc.MediaEngine{}
|
||
if err := m.RegisterDefaultCodecs(); err != nil {
|
||
return nil, err
|
||
}
|
||
se := webrtc.SettingEngine{}
|
||
if raw := strings.TrimSpace(os.Getenv("LIVE_PUBLIC_IP")); raw != "" {
|
||
parts := strings.Split(raw, ",")
|
||
var ips []string
|
||
for _, p := range parts {
|
||
p = strings.TrimSpace(p)
|
||
if p != "" {
|
||
ips = append(ips, p)
|
||
}
|
||
}
|
||
if len(ips) > 0 {
|
||
se.SetNAT1To1IPs(ips, webrtc.ICECandidateTypeHost)
|
||
}
|
||
}
|
||
api := webrtc.NewAPI(
|
||
webrtc.WithMediaEngine(m),
|
||
webrtc.WithSettingEngine(se),
|
||
)
|
||
return api, nil
|
||
}
|
||
|
||
func iceServersFromEnv() []webrtc.ICEServer {
|
||
raw := strings.TrimSpace(os.Getenv("LIVE_ICE_SERVERS"))
|
||
if raw == "" {
|
||
return []webrtc.ICEServer{
|
||
{URLs: []string{"stun:stun.l.google.com:19302"}},
|
||
}
|
||
}
|
||
var servers []webrtc.ICEServer
|
||
if err := json.Unmarshal([]byte(raw), &servers); err != nil {
|
||
return []webrtc.ICEServer{{URLs: []string{"stun:stun.l.google.com:19302"}}}
|
||
}
|
||
return servers
|
||
}
|