mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
109 lines
1.9 KiB
Go
109 lines
1.9 KiB
Go
package gortsplib
|
|
|
|
import (
|
|
"net/url"
|
|
)
|
|
|
|
// DialRead connects to the address and starts reading all tracks.
|
|
func DialRead(address string, proto StreamProtocol) (*ConnClient, Tracks, error) {
|
|
u, err := url.Parse(address)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
conn, err := NewConnClient(ConnClientConf{Host: u.Host})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
_, err = conn.Options(u)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, nil, err
|
|
}
|
|
|
|
tracks, _, err := conn.Describe(u)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, nil, err
|
|
}
|
|
|
|
if proto == StreamProtocolUDP {
|
|
for _, track := range tracks {
|
|
_, err := conn.SetupUDP(u, SetupModePlay, track, 0, 0)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
}
|
|
|
|
} else {
|
|
for _, track := range tracks {
|
|
_, err := conn.SetupTCP(u, SetupModePlay, track)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
_, err = conn.Play(u)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, nil, err
|
|
}
|
|
|
|
return conn, tracks, nil
|
|
}
|
|
|
|
// DialPublish connects to the address and starts publishing the tracks.
|
|
func DialPublish(address string, proto StreamProtocol, tracks Tracks) (*ConnClient, error) {
|
|
u, err := url.Parse(address)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
conn, err := NewConnClient(ConnClientConf{Host: u.Host})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = conn.Options(u)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, err
|
|
}
|
|
|
|
_, err = conn.Announce(u, tracks)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, err
|
|
}
|
|
|
|
if proto == StreamProtocolUDP {
|
|
for _, track := range tracks {
|
|
_, err = conn.SetupUDP(u, SetupModeRecord, track, 0, 0)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
} else {
|
|
for _, track := range tracks {
|
|
_, err = conn.SetupTCP(u, SetupModeRecord, track)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
_, err = conn.Record(u)
|
|
if err != nil {
|
|
conn.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return conn, nil
|
|
}
|