-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathhandler.go
More file actions
88 lines (70 loc) · 2.38 KB
/
handler.go
File metadata and controls
88 lines (70 loc) · 2.38 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
package avformat
import (
"fmt"
"github.com/lkmio/avformat/utils"
"os"
"strconv"
)
type OnUnpackStreamHandler interface {
// OnNewTrack 新的track回调
OnNewTrack(track Track)
// OnTrackComplete track解析完毕回调
OnTrackComplete()
// OnTrackNotFind 未找到track回调
OnTrackNotFind()
OnPacket(packet *AVPacket)
}
type OnUnpackStreamLogger struct {
tracks TrackManager
}
func (o *OnUnpackStreamLogger) OnNewTrack(track Track) {
utils.Assert(o.tracks.Add(track))
if utils.AVMediaTypeAudio == track.GetStream().MediaType {
fmt.Printf("tack type: %s codec: %s index: %d sample_rate: %d channels: %d\r\n", track.GetStream().MediaType.String(), track.GetStream().CodecID.String(), track.GetStream().Index, track.GetStream().SampleRate, track.GetStream().Channels)
} else {
fmt.Printf("tack type: %s codec: %s index: %d\r\n", track.GetStream().MediaType.String(), track.GetStream().CodecID.String(), track.GetStream().Index)
}
}
func (o *OnUnpackStreamLogger) OnTrackComplete() {
fmt.Printf("track complete\r\n")
}
func (o *OnUnpackStreamLogger) OnPacket(packet *AVPacket) {
fmt.Printf("packet type: %s dts: %d pts: %d\r\n", packet.MediaType.String(), packet.Dts, packet.Pts)
}
func (o *OnUnpackStreamLogger) OnTrackNotFind() {
println("track not find")
}
type OnUnpackStream2FileHandler struct {
OnUnpackStreamLogger
Path string
fos []*os.File
}
func (o *OnUnpackStream2FileHandler) OnNewTrack(track Track) {
o.OnUnpackStreamLogger.OnNewTrack(track)
stream := track.GetStream()
file, err := os.OpenFile(o.Path+"."+stream.MediaType.String()+"."+strconv.Itoa(stream.Index)+"."+stream.CodecID.String(), os.O_WRONLY|os.O_CREATE, 132)
if err != nil {
panic(err)
}
o.fos = append(o.fos, file)
}
func (o *OnUnpackStream2FileHandler) OnTrackComplete() {
o.OnUnpackStreamLogger.OnTrackComplete()
}
func (o *OnUnpackStream2FileHandler) OnPacket(packet *AVPacket) {
o.OnUnpackStreamLogger.OnPacket(packet)
data := packet.Data
if utils.AVMediaTypeVideo == packet.MediaType {
stream := o.tracks.Get(packet.Index).GetStream()
data = AVCCPacket2AnnexB(stream, packet)
if packet.Key && PacketTypeAVCC == packet.PacketType && stream.CodecParameters != nil {
extraData := stream.CodecParameters.AnnexBExtraData()
if _, err := o.fos[packet.Index].Write(extraData); err != nil {
panic(err)
}
}
}
if _, err := o.fos[packet.Index].Write(data); err != nil {
panic(err)
}
}