Compare commits

...

11 Commits

Author SHA1 Message Date
dexter
e6d0489d9c Merge pull request #20 from ziminghua/aler9
解决发布超时后,重连RTSP,无法播放的BUG
2022-02-22 21:17:24 +08:00
訾明华
68d0d9aa08 解决发布超时后,重连RTSP,无法播放的BUG
清空rtsp.processFunc数据,避免接收到流时,指向旧的track,导致新stream无法播放
2022-02-22 21:15:35 +08:00
dexter
e411d30e91 Merge pull request #17 from jianglieshan/aler9
fix:修改rtsp插件作为服务端出流时,ssrc为0的bug
2022-01-16 13:12:11 +08:00
jianglieshan
709a4cee7b fix:修改rtsp插件作为服务端出流时,ssrc为0的bug 2022-01-15 16:50:40 +08:00
dexter
a90f52769d Merge pull request #16 from ziminghua/aler9
增加RTSPClient关闭的事件订阅,同步关闭客户端连接
2022-01-11 17:00:40 +08:00
訾明华
3764a26bbd 增加RTSPClient关闭的事件订阅,同步关闭客户端连接
增加RTSPClient关闭的事件订阅,同步关闭客户端连接
2022-01-11 16:52:14 +08:00
dexter
2533ab2604 Merge pull request #15 from ziminghua/aler9
多slice的情况下,同步同一帧的时间戳
2022-01-11 11:40:38 +08:00
訾明华
db07f0d588 多slice的情况下,同步同一帧的时间戳
`vpacketer.Packetize`再打包的过程中会把当前的timestamp+samples作为下一次打包的时间戳,如果多slice会连续传递samples导致同一帧的时间戳不一致
2022-01-11 11:34:29 +08:00
dexter
f110513d70 增加配置项ReadBufferSize 2021-12-29 22:59:45 +08:00
dexter
8901f4c117 修复bug 2021-12-29 22:16:11 +08:00
dexter
2f7c2de352 增加读取缓存大小,设置Mark标志位 2021-12-29 20:18:12 +08:00
3 changed files with 29 additions and 14 deletions

View File

@@ -42,6 +42,7 @@ func (rtsp *RTSPClient) PullStream(streamPath string, rtspUrl string) (err error
time.Sleep(time.Second * 5)
}
if rtsp.IsTimeout {
rtsp.processFunc = nil
go rtsp.PullStream(streamPath, rtspUrl)
}
}()
@@ -145,12 +146,14 @@ func (client *RTSPClient) pullStream() {
}
client.Client = &gortsplib.Client{
OnPacketRTP: func(trackID int, payload []byte) {
// Println("OnPacketRTP", trackID, len(payload))
if f := client.processFunc[trackID]; f != nil {
var clone []byte
f(append(clone, payload...))
}
},
Transport: &client.Transport,
ReadBufferSize: config.ReadBufferSize,
Transport: &client.Transport,
}
// parse URL
u, err := base.ParseURL(client.URL)
@@ -163,6 +166,9 @@ func (client *RTSPClient) pullStream() {
Printf("connect:%s error:%v", client.URL, err)
return
}
client.OnClose = func() {
client.Client.Close()
}
//client.close should be after connected!
defer client.Client.Close()
var res *base.Response

19
main.go
View File

@@ -13,14 +13,15 @@ import (
)
var config = struct {
ListenAddr string
UDPAddr string
RTCPAddr string
Timeout int
Reconnect bool
AutoPullList map[string]string
AutoPushList map[string]string
}{":554", ":8000", ":8001", 0, false, nil, nil}
ListenAddr string
UDPAddr string
RTCPAddr string
Timeout int
Reconnect bool
AutoPullList map[string]string
AutoPushList map[string]string
ReadBufferSize int
}{":554", ":8000", ":8001", 0, false, nil, nil, 2048}
var pconfig = PluginConfig{
Name: "RTSP",
@@ -84,7 +85,7 @@ func runPlugin() {
Println(err)
}
}
go AddHook(HOOK_PUBLISH, func(s *Stream) {
for streamPath, url := range config.AutoPushList {
if s.StreamPath == streamPath {

View File

@@ -75,7 +75,7 @@ func (sh *RTSPServer) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*ba
sub.Type = "RTSP pull"
sub.vt = s.WaitVideoTrack("h264", "h265")
sub.at = s.WaitAudioTrack("aac", "pcma", "pcmu")
ssrc := uintptr(unsafe.Pointer(stream))
ssrc := uintptr(unsafe.Pointer(&stream))
var trackIds = 0
if sub.vt != nil {
trackId := trackIds
@@ -97,9 +97,17 @@ func (sh *RTSPServer) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*ba
}
var st uint32
onVideo := func(ts uint32, pack *engine.VideoPack) {
for _, nalu := range pack.NALUs {
for _, pack := range vpacketer.Packetize(nalu, (ts-st)*90) {
rtp, _ := pack.Marshal()
for i, nalu := range pack.NALUs {
var samples uint32
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)
}
}