mirror of
https://github.com/Monibuca/plugin-rtsp.git
synced 2025-09-27 12:02:20 +08:00
Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e6d0489d9c | ||
![]() |
68d0d9aa08 | ||
![]() |
e411d30e91 | ||
![]() |
709a4cee7b | ||
![]() |
a90f52769d | ||
![]() |
3764a26bbd | ||
![]() |
2533ab2604 | ||
![]() |
db07f0d588 | ||
![]() |
f110513d70 | ||
![]() |
8901f4c117 | ||
![]() |
2f7c2de352 |
@@ -42,6 +42,7 @@ func (rtsp *RTSPClient) PullStream(streamPath string, rtspUrl string) (err error
|
|||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
}
|
}
|
||||||
if rtsp.IsTimeout {
|
if rtsp.IsTimeout {
|
||||||
|
rtsp.processFunc = nil
|
||||||
go rtsp.PullStream(streamPath, rtspUrl)
|
go rtsp.PullStream(streamPath, rtspUrl)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -145,12 +146,14 @@ func (client *RTSPClient) pullStream() {
|
|||||||
}
|
}
|
||||||
client.Client = &gortsplib.Client{
|
client.Client = &gortsplib.Client{
|
||||||
OnPacketRTP: func(trackID int, payload []byte) {
|
OnPacketRTP: func(trackID int, payload []byte) {
|
||||||
|
// Println("OnPacketRTP", trackID, len(payload))
|
||||||
if f := client.processFunc[trackID]; f != nil {
|
if f := client.processFunc[trackID]; f != nil {
|
||||||
var clone []byte
|
var clone []byte
|
||||||
f(append(clone, payload...))
|
f(append(clone, payload...))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Transport: &client.Transport,
|
ReadBufferSize: config.ReadBufferSize,
|
||||||
|
Transport: &client.Transport,
|
||||||
}
|
}
|
||||||
// parse URL
|
// parse URL
|
||||||
u, err := base.ParseURL(client.URL)
|
u, err := base.ParseURL(client.URL)
|
||||||
@@ -163,6 +166,9 @@ func (client *RTSPClient) pullStream() {
|
|||||||
Printf("connect:%s error:%v", client.URL, err)
|
Printf("connect:%s error:%v", client.URL, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
client.OnClose = func() {
|
||||||
|
client.Client.Close()
|
||||||
|
}
|
||||||
//client.close should be after connected!
|
//client.close should be after connected!
|
||||||
defer client.Client.Close()
|
defer client.Client.Close()
|
||||||
var res *base.Response
|
var res *base.Response
|
||||||
|
19
main.go
19
main.go
@@ -13,14 +13,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var config = struct {
|
var config = struct {
|
||||||
ListenAddr string
|
ListenAddr string
|
||||||
UDPAddr string
|
UDPAddr string
|
||||||
RTCPAddr string
|
RTCPAddr string
|
||||||
Timeout int
|
Timeout int
|
||||||
Reconnect bool
|
Reconnect bool
|
||||||
AutoPullList map[string]string
|
AutoPullList map[string]string
|
||||||
AutoPushList map[string]string
|
AutoPushList map[string]string
|
||||||
}{":554", ":8000", ":8001", 0, false, nil, nil}
|
ReadBufferSize int
|
||||||
|
}{":554", ":8000", ":8001", 0, false, nil, nil, 2048}
|
||||||
|
|
||||||
var pconfig = PluginConfig{
|
var pconfig = PluginConfig{
|
||||||
Name: "RTSP",
|
Name: "RTSP",
|
||||||
@@ -84,7 +85,7 @@ func runPlugin() {
|
|||||||
Println(err)
|
Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
go AddHook(HOOK_PUBLISH, func(s *Stream) {
|
go AddHook(HOOK_PUBLISH, func(s *Stream) {
|
||||||
for streamPath, url := range config.AutoPushList {
|
for streamPath, url := range config.AutoPushList {
|
||||||
if s.StreamPath == streamPath {
|
if s.StreamPath == streamPath {
|
||||||
|
16
server.go
16
server.go
@@ -75,7 +75,7 @@ func (sh *RTSPServer) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*ba
|
|||||||
sub.Type = "RTSP pull"
|
sub.Type = "RTSP pull"
|
||||||
sub.vt = s.WaitVideoTrack("h264", "h265")
|
sub.vt = s.WaitVideoTrack("h264", "h265")
|
||||||
sub.at = s.WaitAudioTrack("aac", "pcma", "pcmu")
|
sub.at = s.WaitAudioTrack("aac", "pcma", "pcmu")
|
||||||
ssrc := uintptr(unsafe.Pointer(stream))
|
ssrc := uintptr(unsafe.Pointer(&stream))
|
||||||
var trackIds = 0
|
var trackIds = 0
|
||||||
if sub.vt != nil {
|
if sub.vt != nil {
|
||||||
trackId := trackIds
|
trackId := trackIds
|
||||||
@@ -97,9 +97,17 @@ func (sh *RTSPServer) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*ba
|
|||||||
}
|
}
|
||||||
var st uint32
|
var st uint32
|
||||||
onVideo := func(ts uint32, pack *engine.VideoPack) {
|
onVideo := func(ts uint32, pack *engine.VideoPack) {
|
||||||
for _, nalu := range pack.NALUs {
|
for i, nalu := range pack.NALUs {
|
||||||
for _, pack := range vpacketer.Packetize(nalu, (ts-st)*90) {
|
var samples uint32
|
||||||
rtp, _ := pack.Marshal()
|
if i == len(pack.NALUs)-1 {
|
||||||
|
samples = (ts - st) * 90
|
||||||
|
} else {
|
||||||
|
samples = 0
|
||||||
|
}
|
||||||
|
packs := vpacketer.Packetize(nalu, samples)
|
||||||
|
for j, rtpack := range packs {
|
||||||
|
rtpack.Marker = i == len(pack.NALUs)-1 && j == len(packs)-1
|
||||||
|
rtp, _ := rtpack.Marshal()
|
||||||
stream.WritePacketRTP(trackId, rtp)
|
stream.WritePacketRTP(trackId, rtp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user