Files
monibuca/plugin/rtmp/device.go
2024-11-12 10:19:55 +08:00

58 lines
1.1 KiB
Go

package plugin_rtmp
import (
"fmt"
"net"
"net/url"
"time"
"m7s.live/v5"
)
type RTMPDevice struct {
m7s.DeviceTask
tcpAddr *net.TCPAddr
url *url.URL
}
func (d *RTMPDevice) Start() (err error) {
d.url, err = url.Parse(d.Device.URL)
if err != nil {
return
}
if ips, err := net.LookupIP(d.url.Hostname()); err != nil {
return err
} else if len(ips) == 0 {
return fmt.Errorf("no IP found for host: %s", d.url.Hostname())
} else {
d.tcpAddr, err = net.ResolveTCPAddr("tcp", net.JoinHostPort(ips[0].String(), d.url.Port()))
if err != nil {
return err
}
if d.tcpAddr.Port == 0 {
if d.url.Scheme == "rtmps" {
d.tcpAddr.Port = 443
} else {
d.tcpAddr.Port = 1935
}
}
}
return d.DeviceTask.Start()
}
func (d *RTMPDevice) GetTickInterval() time.Duration {
return time.Second * 5
}
func (d *RTMPDevice) Tick(any) {
startTime := time.Now()
conn, err := net.DialTCP("tcp", nil, d.tcpAddr)
if err != nil {
d.Device.ChangeStatus(m7s.DeviceStatusOffline)
return
}
conn.Close()
d.Device.RTT = time.Since(startTime)
d.Device.ChangeStatus(m7s.DeviceStatusOnline)
}