mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-26 19:21:14 +08:00
支持GB28181三种推流
This commit is contained in:
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -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:]
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
Reference in New Issue
Block a user