fix streams bug
This commit is contained in:
parent
468aeaa1ae
commit
769d03cb9f
56
client.go
56
client.go
@ -34,6 +34,8 @@ type Client struct {
|
|||||||
rtpKeepaliveTimer time.Time
|
rtpKeepaliveTimer time.Time
|
||||||
|
|
||||||
setupCalled bool
|
setupCalled bool
|
||||||
|
setupIdx []int
|
||||||
|
setupMap []int
|
||||||
playCalled bool
|
playCalled bool
|
||||||
|
|
||||||
url *url.URL
|
url *url.URL
|
||||||
@ -99,9 +101,14 @@ func Dial(uri string) (self *Client, err error) {
|
|||||||
return DialTimeout(uri, 0)
|
return DialTimeout(uri, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Client) Streams() (streams []av.CodecData) {
|
func (self *Client) Streams() (streams []av.CodecData, err error) {
|
||||||
for _, stream := range self.streams {
|
if self.setupCalled {
|
||||||
streams = append(streams, stream.CodecData)
|
for _, i := range self.setupIdx {
|
||||||
|
streams = append(streams, self.streams[i].CodecData)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("rtsp: no streams")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -335,8 +342,26 @@ func (self *Client) setupAll() (err error) {
|
|||||||
return self.Setup(idx)
|
return self.Setup(idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Client) Setup(streams []int) (err error) {
|
func (self *Client) Setup(idx []int) (err error) {
|
||||||
for _, si := range streams {
|
if self.setupCalled {
|
||||||
|
err = fmt.Errorf("rtsp: Setup() called twice")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(self.streams) == 0 {
|
||||||
|
err = fmt.Errorf("rtsp: no streams, please call Describe() first")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
self.setupMap = make([]int, len(self.streams))
|
||||||
|
for i := range self.setupMap {
|
||||||
|
self.setupMap[i] = -1
|
||||||
|
}
|
||||||
|
self.setupIdx = idx
|
||||||
|
|
||||||
|
for i, si := range idx {
|
||||||
|
self.setupMap[si] = i
|
||||||
|
|
||||||
uri := ""
|
uri := ""
|
||||||
control := self.streams[si].Sdp.Control
|
control := self.streams[si].Sdp.Control
|
||||||
if strings.HasPrefix(control, "rtsp://") {
|
if strings.HasPrefix(control, "rtsp://") {
|
||||||
@ -356,6 +381,7 @@ func (self *Client) Setup(streams []int) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.setupCalled = true
|
self.setupCalled = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -756,7 +782,7 @@ func (self *Client) poll() (err error) {
|
|||||||
if false {
|
if false {
|
||||||
fmt.Printf("rtsp: #%d %d/%d %d\n", i, stream.timestamp, stream.Sdp.TimeScale, len(stream.pkt.Data))
|
fmt.Printf("rtsp: #%d %d/%d %d\n", i, stream.timestamp, stream.Sdp.TimeScale, len(stream.pkt.Data))
|
||||||
}
|
}
|
||||||
self.pktque.WriteTimePacket(i, time, stream.pkt)
|
self.pktque.WriteTimePacket(self.setupMap[i], time, stream.pkt)
|
||||||
stream.pkt = av.Packet{}
|
stream.pkt = av.Packet{}
|
||||||
stream.gotpkt = false
|
stream.gotpkt = false
|
||||||
return
|
return
|
||||||
@ -784,6 +810,12 @@ func (self *Client) ReadHeader() (err error) {
|
|||||||
if _, err = self.Describe(); err != nil {
|
if _, err = self.Describe(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if err = self.setupAll(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = self.Play(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -792,19 +824,9 @@ func Open(uri string) (cli *Client, err error) {
|
|||||||
if _cli, err = Dial(uri); err != nil {
|
if _cli, err = Dial(uri); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if err = _cli.ReadHeader(); err != nil {
|
||||||
if _, err = _cli.Describe(); err != nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = _cli.setupAll(); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = _cli.Play(); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cli = _cli
|
cli = _cli
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user