-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathbroadcaster.go
More file actions
108 lines (88 loc) · 3.14 KB
/
broadcaster.go
File metadata and controls
108 lines (88 loc) · 3.14 KB
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
103
104
105
106
107
108
package rtmp
import "fmt"
// A subscriber gets sent audio, video and data messages that flow in a particular stream (identified with streamKey)
type Subscriber interface {
SendAudio(audio []byte, timestamp uint32)
SendVideo(video []byte, timestamp uint32)
SendMetadata(metadata map[string]interface{})
GetID() string
SendEndOfStream()
}
type Broadcaster struct {
context ContextStore
}
func NewBroadcaster(context ContextStore) *Broadcaster {
return &Broadcaster{
context: context,
}
}
func (b *Broadcaster) RegisterPublisher(streamKey string) error {
return b.context.RegisterPublisher(streamKey)
}
func (b *Broadcaster) DestroyPublisher(streamKey string) error {
return b.context.DestroyPublisher(streamKey)
}
func (b *Broadcaster) RegisterSubscriber(streamKey string, subscriber Subscriber) error {
return b.context.RegisterSubscriber(streamKey, subscriber)
}
func (b *Broadcaster) StreamExists(streamKey string) bool {
return b.context.StreamExists(streamKey)
}
func (b *Broadcaster) BroadcastAudio(streamKey string, audio []byte, timestamp uint32) error {
subscribers, err := b.context.GetSubscribersForStream(streamKey)
if err != nil {
fmt.Println("broadcaster: BroadcastAudio: error getting subscribers for stream, " + err.Error())
return err
}
for _, sub := range subscribers {
sub.SendAudio(audio, timestamp)
}
return nil
}
func (b *Broadcaster) BroadcastVideo(streamKey string, video []byte, timestamp uint32) error {
subscribers, err := b.context.GetSubscribersForStream(streamKey)
if err != nil {
fmt.Println("broadcaster: BroadcastVideo: error getting subscribers for stream, " + err.Error())
return err
}
for _, sub := range subscribers {
sub.SendVideo(video, timestamp)
}
return nil
}
func (b *Broadcaster) DestroySubscriber(streamKey string, sessionID string) error {
return b.context.DestroySubscriber(streamKey, sessionID)
}
func (b *Broadcaster) SetAvcSequenceHeaderForPublisher(streamKey string, payload []byte) {
b.context.SetAvcSequenceHeaderForPublisher(streamKey, payload)
}
func (b *Broadcaster) GetAvcSequenceHeaderForPublisher(streamKey string) []byte {
return b.context.GetAvcSequenceHeaderForPublisher(streamKey)
}
func (b *Broadcaster) SetAacSequenceHeaderForPublisher(streamKey string, payload []byte) {
b.context.SetAacSequenceHeaderForPublisher(streamKey, payload)
}
func (b *Broadcaster) GetAacSequenceHeaderForPublisher(streamKey string) []byte {
return b.context.GetAacSequenceHeaderForPublisher(streamKey)
}
func (b *Broadcaster) BroadcastEndOfStream(streamKey string) {
subscribers, err := b.context.GetSubscribersForStream(streamKey)
if err != nil {
fmt.Println("broadcaster: broadcast end of stream: error getting subscribers for stream, " + err.Error())
return
}
for _, sub := range subscribers {
sub.SendEndOfStream()
}
}
func (b *Broadcaster) BroadcastMetadata(streamKey string, metadata map[string]interface{}) error {
subscribers, err := b.context.GetSubscribersForStream(streamKey)
if err != nil {
fmt.Println("broadcaster: BroadcastVideo: error getting subscribers for stream, " + err.Error())
return err
}
for _, sub := range subscribers {
sub.SendMetadata(metadata)
}
return nil
}