-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathencoder.go
More file actions
72 lines (58 loc) · 1.67 KB
/
Copy pathencoder.go
File metadata and controls
72 lines (58 loc) · 1.67 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
package audio_transcoder
import (
"fmt"
"reflect"
)
var (
encoders = make(map[string]struct {
encoder Encoder
sampleRate []int
maxChannels int
})
)
type Encoder interface {
Encode(pcm []byte, cb func([]byte)) (int, error)
ExtraData() []byte
Destroy()
PacketDurationMS() int
}
func RegisterEncoder(name string, encoder Encoder, sampleRate []int, maxChannels int) {
if _, ok := encoders[name]; ok {
panic("encoder already registered with name " + name)
}
encoders[name] = struct {
encoder Encoder
sampleRate []int
maxChannels int
}{encoder: encoder, sampleRate: sampleRate, maxChannels: maxChannels}
}
func FindEncoder(name string, sampleRate, channels int) (Encoder, error) {
encoder, ok := encoders[name]
if !ok {
return nil, fmt.Errorf("encoder not found with name %s", name)
}
if channels > encoder.maxChannels {
return nil, fmt.Errorf("encoder %s does not support %d channels", name, channels)
}
for _, rate := range encoder.sampleRate {
if rate == sampleRate {
t := reflect.TypeOf(encoder.encoder)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
newDecoder := reflect.New(t).Interface().(Encoder)
// 如果是G711Encoder, 则复制encoderType
_, ok := encoder.encoder.(*G711Encoder)
if ok {
newDecoder.(*G711Encoder).encoderType = encoder.encoder.(*G711Encoder).encoderType
}
return newDecoder, nil
}
}
return nil, fmt.Errorf("encoder %s does not support %d sample rate", name, sampleRate)
}
func init() {
RegisterEncoder("PCMA", &G711Encoder{encoderType: PCMA}, []int{8000}, 2)
RegisterEncoder("PCMU", &G711Encoder{encoderType: PCMU}, []int{8000}, 2)
RegisterEncoder("G726", &G726Encoder{}, []int{8000}, 1)
}