add newTrack()
This commit is contained in:
parent
37f64f9a63
commit
7e9a708556
114
muxer.go
114
muxer.go
@ -18,20 +18,11 @@ type Muxer struct {
|
|||||||
mdatWriter *atom.Writer
|
mdatWriter *atom.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Muxer) AddAACTrack() (track *Track) {
|
func (self *Muxer) newTrack() *Track {
|
||||||
track = &Track{}
|
track := &Track{}
|
||||||
track.Type = AAC
|
|
||||||
|
|
||||||
track.sample = &atom.SampleTable{
|
track.sample = &atom.SampleTable{
|
||||||
SampleDesc: &atom.SampleDesc{
|
SampleDesc: &atom.SampleDesc{},
|
||||||
Mp4aDesc: &atom.Mp4aDesc{
|
|
||||||
DataRefIdx: 1,
|
|
||||||
NumberOfChannels: 0, // fill later
|
|
||||||
SampleSize: 0, // fill later
|
|
||||||
SampleRate: 0, // fill later
|
|
||||||
Conf: &atom.ElemStreamDesc{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
TimeToSample: &atom.TimeToSample{},
|
TimeToSample: &atom.TimeToSample{},
|
||||||
SampleToChunk: &atom.SampleToChunk{
|
SampleToChunk: &atom.SampleToChunk{
|
||||||
Entries: []atom.SampleToChunkEntry{
|
Entries: []atom.SampleToChunkEntry{
|
||||||
@ -46,8 +37,6 @@ func (self *Muxer) AddAACTrack() (track *Track) {
|
|||||||
Entries: []int{8},
|
Entries: []int{8},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
track.sampleToChunkEntry = &track.sample.SampleToChunk.Entries[0]
|
|
||||||
track.writeMdat = self.writeMdat
|
|
||||||
|
|
||||||
track.TrackAtom = &atom.Track{
|
track.TrackAtom = &atom.Track{
|
||||||
Header: &atom.TrackHeader{
|
Header: &atom.TrackHeader{
|
||||||
@ -75,25 +64,39 @@ func (self *Muxer) AddAACTrack() (track *Track) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Handler: &atom.HandlerRefer{
|
|
||||||
SubType: "soun",
|
|
||||||
Name: "Sound Handler",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
self.TrackAAC = track
|
track.writeMdat = self.writeMdat
|
||||||
|
track.sampleToChunkEntry = &track.sample.SampleToChunk.Entries[0]
|
||||||
self.Tracks = append(self.Tracks, track)
|
self.Tracks = append(self.Tracks, track)
|
||||||
|
|
||||||
|
return track
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Muxer) AddAACTrack() (track *Track) {
|
||||||
|
track = self.newTrack()
|
||||||
|
self.TrackAAC = track
|
||||||
|
track.Type = AAC
|
||||||
|
track.sample.SampleDesc.Mp4aDesc = &atom.Mp4aDesc{
|
||||||
|
DataRefIdx: 1,
|
||||||
|
NumberOfChannels: 0, // fill later
|
||||||
|
SampleSize: 0, // fill later
|
||||||
|
SampleRate: 0, // fill later
|
||||||
|
Conf: &atom.ElemStreamDesc{},
|
||||||
|
}
|
||||||
|
track.TrackAtom.Media.Handler = &atom.HandlerRefer{
|
||||||
|
SubType: "soun",
|
||||||
|
Name: "Sound Handler",
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Muxer) AddH264Track() (track *Track) {
|
func (self *Muxer) AddH264Track() (track *Track) {
|
||||||
track = &Track{}
|
track = self.newTrack()
|
||||||
track.Type = H264
|
track.Type = H264
|
||||||
|
self.TrackH264 = track
|
||||||
track.sample = &atom.SampleTable{
|
track.sample.SampleDesc.Avc1Desc = &atom.Avc1Desc{
|
||||||
SampleDesc: &atom.SampleDesc{
|
|
||||||
Avc1Desc: &atom.Avc1Desc{
|
|
||||||
DataRefIdx: 1,
|
DataRefIdx: 1,
|
||||||
HorizontalResolution: 72,
|
HorizontalResolution: 72,
|
||||||
VorizontalResolution: 72,
|
VorizontalResolution: 72,
|
||||||
@ -103,68 +106,18 @@ func (self *Muxer) AddH264Track() (track *Track) {
|
|||||||
Depth: 24,
|
Depth: 24,
|
||||||
ColorTableId: -1,
|
ColorTableId: -1,
|
||||||
Conf: &atom.Avc1Conf{},
|
Conf: &atom.Avc1Conf{},
|
||||||
},
|
|
||||||
},
|
|
||||||
TimeToSample: &atom.TimeToSample{},
|
|
||||||
SampleToChunk: &atom.SampleToChunk{
|
|
||||||
Entries: []atom.SampleToChunkEntry{
|
|
||||||
{
|
|
||||||
FirstChunk: 1,
|
|
||||||
SampleDescId: 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SampleSize: &atom.SampleSize{},
|
|
||||||
ChunkOffset: &atom.ChunkOffset{
|
|
||||||
Entries: []int{8},
|
|
||||||
},
|
|
||||||
SyncSample: &atom.SyncSample{},
|
|
||||||
}
|
}
|
||||||
track.sampleToChunkEntry = &track.sample.SampleToChunk.Entries[0]
|
track.TrackAtom.Media.Handler = &atom.HandlerRefer{
|
||||||
track.writeMdat = self.writeMdat
|
|
||||||
|
|
||||||
track.TrackAtom = &atom.Track{
|
|
||||||
Header: &atom.TrackHeader{
|
|
||||||
TrackId: len(self.Tracks)+1,
|
|
||||||
Flags: 0x0003, // Track enabled | Track in movie
|
|
||||||
Duration: 0, // fill later
|
|
||||||
Volume: atom.IntToFixed(1),
|
|
||||||
Matrix: [9]int{0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000},
|
|
||||||
TrackWidth: atom.IntToFixed(0), // fill later
|
|
||||||
TrackHeight: atom.IntToFixed(0), // fill later
|
|
||||||
},
|
|
||||||
|
|
||||||
Media: &atom.Media{
|
|
||||||
Header: &atom.MediaHeader{
|
|
||||||
TimeScale: 0, // fill later
|
|
||||||
Duration: 0, // fill later
|
|
||||||
},
|
|
||||||
Info: &atom.MediaInfo{
|
|
||||||
Video: &atom.VideoMediaInfo{
|
|
||||||
Flags: 0x000001,
|
|
||||||
},
|
|
||||||
Sample: track.sample,
|
|
||||||
Data: &atom.DataInfo{
|
|
||||||
Refer: &atom.DataRefer{
|
|
||||||
Url: &atom.DataReferUrl{
|
|
||||||
Flags: 0x000001, // Self reference
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Handler: &atom.HandlerRefer{
|
|
||||||
SubType: "vide",
|
SubType: "vide",
|
||||||
Name: "Video Media Handler",
|
Name: "Video Media Handler",
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.TrackH264 = track
|
|
||||||
self.Tracks = append(self.Tracks, track)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Muxer) writeMdat(data []byte) (err error) {
|
func (self *Muxer) writeMdat(data []byte) (pos int64, err error) {
|
||||||
|
if pos, err = self.mdatWriter.Seek(0, 1); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
_, err = self.mdatWriter.Write(data)
|
_, err = self.mdatWriter.Write(data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -190,8 +143,9 @@ func (self *Track) SetTimeScale(timeScale int64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Track) WriteSample(pts int64, dts int64, isKeyFrame bool, data []byte) (err error) {
|
func (self *Track) WriteSample(pts int64, dts int64, isKeyFrame bool, data []byte) (err error) {
|
||||||
|
//var filePos int64
|
||||||
sampleSize := len(data)
|
sampleSize := len(data)
|
||||||
if err = self.writeMdat(data); err != nil {
|
if _, err = self.writeMdat(data); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user