-
Notifications
You must be signed in to change notification settings - Fork 27
/
main.go
79 lines (66 loc) · 1.66 KB
/
main.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
package main
import (
"fmt"
"log"
"time"
"github.com/bluenviron/gohlslib/v2"
"github.com/bluenviron/gohlslib/v2/pkg/codecs"
)
// This example shows how to
// 1. read a HLS stream
// 2. check if there's a MPEG-4 audio track
// 2. save the MPEG-4 audio track to disk in MPEG-TS format
func multiplyAndDivide(v, m, d int64) int64 {
secs := v / d
dec := v % d
return (secs*m + dec*m/d)
}
func findMPEG4AudioTrack(tracks []*gohlslib.Track) *gohlslib.Track {
for _, track := range tracks {
if _, ok := track.Codec.(*codecs.MPEG4Audio); ok {
return track
}
}
return nil
}
func main() {
// setup client
c := &gohlslib.Client{
URI: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8",
}
// called when tracks are parsed
c.OnTracks = func(tracks []*gohlslib.Track) error {
// find the MPEG-4 Audio track
track := findMPEG4AudioTrack(tracks)
if track == nil {
return fmt.Errorf("MPEG-4 audio track not found")
}
// create the MPEG-TS muxer
m := &mpegtsMuxer{
fileName: "mystream.ts",
config: &track.Codec.(*codecs.MPEG4Audio).Config,
}
err := m.initialize()
if err != nil {
return nil
}
// set a callback that is called when data is received
c.OnDataMPEG4Audio(track, func(pts int64, aus [][]byte) {
log.Printf("received access unit with pts = %v\n", pts)
// send data to the MPEG-TS muxer
err := m.writeMPEG4Audio(aus, multiplyAndDivide(int64(pts), 90000, int64(time.Second)))
if err != nil {
panic(err)
}
})
return nil
}
// start reading
err := c.Start()
if err != nil {
panic(err)
}
defer c.Close()
// wait for a fatal error
panic(<-c.Wait())
}