golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							95 lines
						
					
					
						
							1.7 KiB
						
					
					
				package main | 
						|
 | 
						|
import ( | 
						|
	"net" | 
						|
	"time" | 
						|
) | 
						|
 | 
						|
type streamerUdpListenerState int | 
						|
 | 
						|
const ( | 
						|
	_UDPL_STATE_STARTING streamerUdpListenerState = iota | 
						|
	_UDPL_STATE_RUNNING | 
						|
) | 
						|
 | 
						|
type streamerUdpListener struct { | 
						|
	p             *program | 
						|
	streamer      *streamer | 
						|
	trackId       int | 
						|
	trackFlowType trackFlowType | 
						|
	publisherIp   net.IP | 
						|
	publisherPort int | 
						|
	nconn         *net.UDPConn | 
						|
	running       bool | 
						|
	readBuf1      []byte | 
						|
	readBuf2      []byte | 
						|
	readCurBuf    bool | 
						|
	lastFrameTime time.Time | 
						|
 | 
						|
	done chan struct{} | 
						|
} | 
						|
 | 
						|
func newStreamerUdpListener(p *program, port int, streamer *streamer, | 
						|
	trackId int, trackFlowType trackFlowType, publisherIp net.IP) (*streamerUdpListener, error) { | 
						|
	nconn, err := net.ListenUDP("udp", &net.UDPAddr{ | 
						|
		Port: port, | 
						|
	}) | 
						|
	if err != nil { | 
						|
		return nil, err | 
						|
	} | 
						|
 | 
						|
	l := &streamerUdpListener{ | 
						|
		p:             p, | 
						|
		streamer:      streamer, | 
						|
		trackId:       trackId, | 
						|
		trackFlowType: trackFlowType, | 
						|
		publisherIp:   publisherIp, | 
						|
		nconn:         nconn, | 
						|
		readBuf1:      make([]byte, 2048), | 
						|
		readBuf2:      make([]byte, 2048), | 
						|
		lastFrameTime: time.Now(), | 
						|
		done:          make(chan struct{}), | 
						|
	} | 
						|
 | 
						|
	return l, nil | 
						|
} | 
						|
 | 
						|
func (l *streamerUdpListener) close() { | 
						|
	l.nconn.Close() | 
						|
 | 
						|
	if l.running { | 
						|
		<-l.done | 
						|
	} | 
						|
} | 
						|
 | 
						|
func (l *streamerUdpListener) start() { | 
						|
	l.running = true | 
						|
	go l.run() | 
						|
} | 
						|
 | 
						|
func (l *streamerUdpListener) run() { | 
						|
	for { | 
						|
		var buf []byte | 
						|
		if !l.readCurBuf { | 
						|
			buf = l.readBuf1 | 
						|
		} else { | 
						|
			buf = l.readBuf2 | 
						|
		} | 
						|
		l.readCurBuf = !l.readCurBuf | 
						|
 | 
						|
		n, addr, err := l.nconn.ReadFromUDP(buf) | 
						|
		if err != nil { | 
						|
			break | 
						|
		} | 
						|
 | 
						|
		if !l.publisherIp.Equal(addr.IP) || addr.Port != l.publisherPort { | 
						|
			continue | 
						|
		} | 
						|
 | 
						|
		l.lastFrameTime = time.Now() | 
						|
 | 
						|
		l.p.events <- programEventStreamerFrame{l.streamer, l.trackId, l.trackFlowType, buf[:n]} | 
						|
	} | 
						|
 | 
						|
	close(l.done) | 
						|
}
 | 
						|
 |