Files
gortsplib/examples/read-udp.go
2020-09-20 14:07:11 +02:00

96 lines
1.6 KiB
Go

// +build ignore
package main
import (
"fmt"
"net/url"
"sync"
"github.com/aler9/gortsplib"
)
func main() {
u, err := url.Parse("rtsp://user:pass@example.com/mystream")
if err != nil {
panic(err)
}
conn, err := gortsplib.NewConnClient(gortsplib.ConnClientConf{Host: u.Host})
if err != nil {
panic(err)
}
defer conn.Close()
_, err = conn.Options(u)
if err != nil {
panic(err)
}
tracks, _, err := conn.Describe(u)
if err != nil {
panic(err)
}
var rtpReads []gortsplib.UDPReadFunc
var rtcpReads []gortsplib.UDPReadFunc
for _, track := range tracks {
rtpRead, rtcpRead, _, err := conn.SetupUDP(u, track, 0, 0)
if err != nil {
panic(err)
}
rtpReads = append(rtpReads, rtpRead)
rtcpReads = append(rtcpReads, rtcpRead)
}
_, err = conn.Play(u)
if err != nil {
panic(err)
}
var wg sync.WaitGroup
// receive RTP frames
for trackId, rtpRead := range rtpReads {
wg.Add(1)
go func(trackId int, rtpRead gortsplib.UDPReadFunc) {
defer wg.Done()
for {
buf, err := rtpRead()
if err != nil {
break
}
fmt.Printf("frame from track %d, type RTP: %v\n", trackId, buf)
}
}(trackId, rtpRead)
}
// receive RTCP frames
for trackId, rtcpRead := range rtcpReads {
wg.Add(1)
go func(trackId int, rtcpRead gortsplib.UDPReadFunc) {
defer wg.Done()
for {
buf, err := rtcpRead()
if err != nil {
break
}
fmt.Printf("frame from track %d, type RTCP: %v\n", trackId, buf)
}
}(trackId, rtcpRead)
}
err = conn.LoopUDP(u)
conn.Close()
wg.Wait()
fmt.Println("connection is closed (%s)", err)
}