-
Notifications
You must be signed in to change notification settings - Fork 0
/
subscriber.go
102 lines (99 loc) · 2.21 KB
/
subscriber.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package rtsp2
import (
"github.com/AlexxIT/go2rtc/pkg/core"
"github.com/AlexxIT/go2rtc/pkg/rtsp"
"m7s.live/engine/v4"
"m7s.live/engine/v4/codec"
"m7s.live/engine/v4/track"
)
type RTSPSubscriber struct {
engine.Subscriber
videoSender *core.Receiver
audioSender *core.Receiver
Conn *rtsp.Conn `json:"-" yaml:"-"`
}
func (p *RTSPSubscriber) OnEvent(event any) {
switch v := event.(type) {
case *track.Audio:
if p.audioSender != nil {
break
}
var c *core.Codec
var media *core.Media
switch v.CodecID {
case codec.CodecID_AAC:
c = &core.Codec{
Name: core.CodecAAC,
ClockRate: v.SampleRate,
Channels: uint16(v.Channels),
PayloadType: v.PayloadType,
}
case codec.CodecID_PCMA:
c = &core.Codec{
Name: core.CodecPCMA,
ClockRate: v.SampleRate,
Channels: uint16(v.Channels),
PayloadType: v.PayloadType,
}
case codec.CodecID_PCMU:
c = &core.Codec{
Name: core.CodecPCMU,
ClockRate: v.SampleRate,
Channels: uint16(v.Channels),
PayloadType: v.PayloadType,
}
}
media = &core.Media{
Kind: "audio",
Direction: "sendonly",
Codecs: []*core.Codec{c},
}
if p.videoSender == nil {
media.ID = "0"
} else {
media.ID = "1"
}
p.audioSender = core.NewReceiver(media, c)
p.Conn.AddTrack(media, c, p.audioSender)
p.AddTrack(v)
case *track.Video:
if p.videoSender != nil {
break
}
var c *core.Codec
var media *core.Media
switch v.CodecID {
case codec.CodecID_H264:
c = &core.Codec{
Name: core.CodecH264,
ClockRate: v.SampleRate,
PayloadType: v.PayloadType,
}
case codec.CodecID_H265:
c = &core.Codec{
Name: core.CodecH265,
ClockRate: v.SampleRate,
PayloadType: v.PayloadType,
}
}
media = &core.Media{
Kind: "video",
Direction: "sendonly",
Codecs: []*core.Codec{c},
}
if p.audioSender == nil {
media.ID = "0"
} else {
media.ID = "1"
}
p.videoSender = core.NewReceiver(media, c)
p.Conn.AddTrack(media, c, p.videoSender)
p.AddTrack(v)
case engine.VideoRTP:
p.videoSender.WriteRTP(v.Packet)
case engine.AudioRTP:
p.audioSender.WriteRTP(v.Packet)
default:
p.Subscriber.OnEvent(event)
}
}