forked from Monibuca/engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rtp_audio.go
70 lines (64 loc) · 1.42 KB
/
rtp_audio.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
package engine
import (
"github.com/Monibuca/utils/v3/codec"
"github.com/pion/rtp"
)
type RTPPublisher struct {
rtp.Packet `json:"-"`
lastTs uint32
absTs uint32
lastSeq uint16
ts uint32 //毫秒单位的时间戳
demux func()
}
type RTPAudio struct {
RTPPublisher
*AudioTrack
}
func (s *Stream) NewRTPAudio(codec byte) (r *RTPAudio) {
r = &RTPAudio{
AudioTrack: s.NewAudioTrack(codec),
}
r.demux = r.push
return
}
func (v *RTPAudio) push() {
switch v.CodecID {
case codec.CodecID_AAC:
v.demux = func() {
for _, payload := range codec.ParseRTPAAC(v.Payload) {
v.PushRaw(v.ts, payload)
}
}
case codec.CodecID_PCMA, codec.CodecID_PCMU:
v.demux = func() {
v.PushRaw(v.ts, v.Payload)
}
}
v.demux()
}
func (p *RTPAudio) Push(payload []byte) {
if p.Unmarshal(payload) == nil {
if p.lastTs != 0 {
if p.SequenceNumber != p.lastSeq+1 {
println("RTP Publisher: SequenceNumber error", p.lastSeq, p.SequenceNumber)
return
} else {
// if p.lastTs > p.Timestamp {
// if p.lastTs-p.Timestamp > 100000 {
// p.absTs += (p.Timestamp)
// } else { //B frame
// p.absTs -= (p.lastTs - p.Timestamp)
// }
// } else {
// p.absTs += (p.Timestamp - p.lastTs)
// }
p.absTs += (p.Timestamp - p.lastTs)
p.ts = uint32(uint64(p.absTs) * 1000 / uint64(p.SoundRate))
}
}
p.lastTs = p.Timestamp
p.lastSeq = p.SequenceNumber
p.demux()
}
}