mirror of
https://github.com/aler9/gortsplib
synced 2025-10-06 23:52:46 +08:00
103 lines
1.7 KiB
Go
103 lines
1.7 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)
|
|
}
|
|
|
|
type trackListenerPair struct {
|
|
rtpl *gortsplib.ConnClientUdpListener
|
|
rtcpl *gortsplib.ConnClientUdpListener
|
|
}
|
|
var listeners []*trackListenerPair
|
|
|
|
for _, track := range tracks {
|
|
rtpl, rtcpl, _, err := conn.SetupUdp(u, track, 9000+track.Id*2, 9001+track.Id*2)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
listeners = append(listeners, &trackListenerPair{
|
|
rtpl: rtpl,
|
|
rtcpl: rtcpl,
|
|
})
|
|
}
|
|
|
|
_, err = conn.Play(u)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
for trackId, lp := range listeners {
|
|
wg.Add(2)
|
|
|
|
// receive RTP packets
|
|
go func(trackId int, l *gortsplib.ConnClientUdpListener) {
|
|
defer wg.Done()
|
|
|
|
buf := make([]byte, 2048)
|
|
for {
|
|
n, err := l.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
fmt.Printf("packet from track %d, type RTP: %v\n", trackId, buf[:n])
|
|
}
|
|
}(trackId, lp.rtpl)
|
|
|
|
// receive RTCP packets
|
|
go func(trackId int, l *gortsplib.ConnClientUdpListener) {
|
|
defer wg.Done()
|
|
|
|
buf := make([]byte, 2048)
|
|
for {
|
|
n, err := l.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
fmt.Printf("packet from track %d, type RTCP: %v\n", trackId, buf[:n])
|
|
}
|
|
}(trackId, lp.rtcpl)
|
|
}
|
|
|
|
err = conn.LoopUDP(u)
|
|
fmt.Println("connection is closed (%s)", err)
|
|
|
|
for _, lp := range listeners {
|
|
lp.rtpl.Close()
|
|
lp.rtcpl.Close()
|
|
}
|
|
wg.Wait()
|
|
}
|