-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathaudio.go
87 lines (75 loc) · 1.79 KB
/
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main
/*
import (
"bytes"
"errors"
"github.com/jonas747/ogg"
"io"
"os"
"os/exec"
"strings"
)
*/
/*
These functions help with audio conversion and prepare files for transmission
*/
/*
// MakeAudioBuffer will return a [][]byte for the provided ogg/opus path
func MakeAudioBuffer(path string) (output [][]byte, err error) {
reader, err := os.Open(path)
defer reader.Close()
if err != nil {
return output, err
}
oggdecoder := ogg.NewDecoder(reader)
packetdecoder := ogg.NewPacketDecoder(oggdecoder)
for {
packet, _, err := packetdecoder.Decode()
if err != nil {
return output, err
}
output = append(output, packet)
}
}
// ToOpus will convert the provided file (which always comes out of "./tmp") to an opus/ogg file for buffering.
// Note that this function merely splits the pathname (file.mp4 to "file") and passes it to ConvertAudio for the rest.
func ToOpus(path string) (err error) {
args := strings.Split(path, ".")
if len(args) < 2 {
return errors.New("Invalid target")
}
err = ConvertAudio("tmp/"+path, "tmp/"+args[0]+".opus")
if err != nil {
return err
}
return nil
}
// ConvertAudio will convert the provided file (typically in mp4 format) to opus
func ConvertAudio(from string, to string) (err error) {
avconv := exec.Command("avconv", "-i", from, "-f", "wav", "-")
opusenc := exec.Command("opusenc", "--bitrate", "256", "-", to)
r, w := io.Pipe()
avconv.Stdout = w
opusenc.Stdin = r
defer r.Close()
var b2 bytes.Buffer
opusenc.Stdout = &b2
if err = avconv.Start(); err != nil {
return err
}
if err = opusenc.Start(); err != nil {
return err
}
if err = avconv.Wait(); err != nil {
return err
}
if err = w.Close(); err != nil {
return err
}
if err = opusenc.Wait(); err != nil {
return err
}
//io.Copy(os.Stdout, &b2)
return nil
}
*/