支持GB28181三种推流

This commit is contained in:
yangjiechina
2024-05-03 22:50:45 +08:00
parent 43fd14b219
commit b4487b95cb
38 changed files with 2634 additions and 362 deletions

View File

@@ -11,6 +11,10 @@ import (
"time"
)
var (
TransportManger stream.TransportManager
)
// 对于UDP而言, 每个sink维护一对UDPTransport
// TCP直接单端口传输
type sink struct {
@@ -39,13 +43,13 @@ func (s *sink) setTrackCount(count int) {
s.tracks = make([]*rtspTrack, count)
}
func (s *sink) addTrack(index int, tcp bool, ssrc uint32) (int, int, error) {
func (s *sink) addTrack(index int, tcp bool, ssrc uint32) (uint16, uint16, error) {
utils.Assert(index < cap(s.tracks))
utils.Assert(s.tracks[index] == nil)
var err error
var rtpPort int
var rtcpPort int
var rtpPort uint16
var rtcpPort uint16
track := rtspTrack{
ssrc: ssrc,
@@ -53,7 +57,7 @@ func (s *sink) addTrack(index int, tcp bool, ssrc uint32) (int, int, error) {
if tcp {
s.tcp = true
} else {
err = rtspTransportManger.AllocPairTransport(func(port int) {
err = TransportManger.AllocPairTransport(func(port uint16) error {
//rtp port
var addr *net.UDPAddr
addr, err = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", "0.0.0.0", port))
@@ -64,7 +68,8 @@ func (s *sink) addTrack(index int, tcp bool, ssrc uint32) (int, int, error) {
}
rtpPort = port
}, func(port int) {
return nil
}, func(port uint16) error {
//rtcp port
var addr *net.UDPAddr
addr, err = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", "0.0.0.0", port))
@@ -78,6 +83,8 @@ func (s *sink) addTrack(index int, tcp bool, ssrc uint32) (int, int, error) {
}
rtcpPort = port
return nil
})
}

View File

@@ -45,6 +45,14 @@ func NewTransStream(addr net.IPAddr, urlFormat string) stream.ITransStream {
return t
}
func TransStreamFactory(source stream.ISource, protocol stream.Protocol, streams []utils.AVStream) (stream.ITransStream, error) {
trackFormat := source.Id() + "?track=%d"
return NewTransStream(net.IPAddr{
IP: net.IP{},
Zone: "",
}, trackFormat), nil
}
func (t *tranStream) onAllocBuffer(params interface{}) []byte {
return t.rtpTracks[params.(int)].buffer[OverTcpHeaderSize:]
}

View File

@@ -1,71 +0,0 @@
package rtsp
import (
"fmt"
"github.com/yangjiechina/avformat/libbufio"
"github.com/yangjiechina/avformat/utils"
)
type TransportManager interface {
init(startPort, endPort int)
AllocTransport(tcp bool, cb func(port int)) error
AllocPairTransport(cb func(port int)) error
}
var rtspTransportManger transportManager
func init() {
rtspTransportManger = transportManager{}
rtspTransportManger.init(20000, 30000)
}
type transportManager struct {
startPort int
endPort int
nextPort int
}
func (t *transportManager) init(startPort, endPort int) {
utils.Assert(endPort > startPort)
t.startPort = startPort
t.endPort = endPort + 1
t.nextPort = startPort
}
func (t *transportManager) AllocTransport(tcp bool, cb func(port int)) error {
loop := func(start, end int, tcp bool) int {
for i := start; i < end; i++ {
if used := utils.Used(i, tcp); !used {
cb(i)
return i
}
}
return -1
}
port := loop(t.nextPort, t.endPort, tcp)
if port == -1 {
port = loop(t.startPort, t.nextPort, tcp)
}
if port == -1 {
return fmt.Errorf("no available ports in the [%d-%d] range", t.startPort, t.endPort)
}
t.nextPort = t.nextPort + 1%t.endPort
t.nextPort = libbufio.MaxInt(t.nextPort, t.startPort)
return nil
}
func (t *transportManager) AllocPairTransport(cb func(port int), cb2 func(port int)) error {
if err := t.AllocTransport(false, cb); err != nil {
return err
}
if err := t.AllocTransport(false, cb2); err != nil {
return err
}
return nil
}