Add working Segment duration
This commit is contained in:
parent
97e71357be
commit
6511f2e9c1
|
@ -44,6 +44,10 @@ func (e *FrameEncoder) GetInputSize() int {
|
||||||
return int(e.handle.input_packet_size)
|
return int(e.handle.input_packet_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *FrameEncoder) GetSamplesPerPacket() int {
|
||||||
|
return int(e.handle.frames_per_packet)
|
||||||
|
}
|
||||||
|
|
||||||
func (e *FrameEncoder) WritePacket(pcm []byte) []byte {
|
func (e *FrameEncoder) WritePacket(pcm []byte) []byte {
|
||||||
output := make([]byte, int(e.handle.output_max_packet_size))
|
output := make([]byte, int(e.handle.output_max_packet_size))
|
||||||
outBytes := C.alac_encoder_write(&e.handle, (*C.uchar)(unsafe.Pointer(&pcm[0])), C.int(len(pcm)), (*C.uchar)(unsafe.Pointer(&output[0])))
|
outBytes := C.alac_encoder_write(&e.handle, (*C.uchar)(unsafe.Pointer(&pcm[0])), C.int(len(pcm)), (*C.uchar)(unsafe.Pointer(&output[0])))
|
||||||
|
|
57
mp4.go
57
mp4.go
|
@ -8,12 +8,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type FormatEncoder struct {
|
type FormatEncoder struct {
|
||||||
encoder *FrameEncoder
|
encoder *FrameEncoder
|
||||||
writer io.Writer
|
writer io.Writer
|
||||||
buffer []byte
|
sampleRate int
|
||||||
segmentDuration int64
|
buffer []byte
|
||||||
trackId uint32
|
outputBuffer [][]byte
|
||||||
seqNumber uint32
|
segmentDuration time.Duration
|
||||||
|
samplesPerPacket int
|
||||||
|
packetsWritten int
|
||||||
|
trackId uint32
|
||||||
|
seqNumber uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type alacBox struct {
|
type alacBox struct {
|
||||||
|
@ -58,13 +62,16 @@ func NewFormatEncoder(writer io.Writer, sampleRate, channels, bitDepth int, fast
|
||||||
e := &FormatEncoder{
|
e := &FormatEncoder{
|
||||||
encoder: NewFrameEncoder(sampleRate, channels, bitDepth, fastMode),
|
encoder: NewFrameEncoder(sampleRate, channels, bitDepth, fastMode),
|
||||||
writer: writer,
|
writer: writer,
|
||||||
segmentDuration: segmentDuration.Milliseconds(),
|
sampleRate: sampleRate,
|
||||||
|
segmentDuration: segmentDuration,
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.encoder == nil {
|
if e.encoder == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.samplesPerPacket = e.encoder.GetSamplesPerPacket()
|
||||||
|
|
||||||
init := mp4.CreateEmptyInit()
|
init := mp4.CreateEmptyInit()
|
||||||
init.AddEmptyTrack(uint32(sampleRate), "audio", "en")
|
init.AddEmptyTrack(uint32(sampleRate), "audio", "en")
|
||||||
e.trackId = init.Moov.Mvhd.NextTrackID - 1
|
e.trackId = init.Moov.Mvhd.NextTrackID - 1
|
||||||
|
@ -84,21 +91,39 @@ func NewFormatEncoder(writer io.Writer, sampleRate, channels, bitDepth int, fast
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *FormatEncoder) outputPacket(packet []byte) {
|
func (e *FormatEncoder) outputPacket(packet []byte) {
|
||||||
//TODO: more frames
|
e.outputBuffer = append(e.outputBuffer, packet)
|
||||||
|
|
||||||
|
if time.Duration(float64(time.Second)*(float64(e.samplesPerPacket*len(e.outputBuffer))/float64(e.sampleRate))) >= e.segmentDuration {
|
||||||
|
e.outputSegment()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *FormatEncoder) outputSegment() {
|
||||||
|
if len(e.outputBuffer) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
seg := mp4.NewMediaSegment()
|
seg := mp4.NewMediaSegment()
|
||||||
frag, _ := mp4.CreateFragment(e.seqNumber, e.trackId)
|
frag, _ := mp4.CreateFragment(e.seqNumber, e.trackId)
|
||||||
seg.AddFragment(frag)
|
seg.AddFragment(frag)
|
||||||
frag.AddFullSampleToTrack(mp4.FullSample{
|
|
||||||
Sample: mp4.Sample{
|
for _, b := range e.outputBuffer {
|
||||||
Dur: 4096, //TODO
|
frag.AddFullSampleToTrack(mp4.FullSample{
|
||||||
Size: uint32(len(packet)),
|
Sample: mp4.Sample{
|
||||||
},
|
Dur: uint32(e.samplesPerPacket),
|
||||||
DecodeTime: uint64(4096 * e.seqNumber),
|
Size: uint32(len(b)),
|
||||||
Data: packet,
|
},
|
||||||
}, e.trackId)
|
DecodeTime: uint64(e.samplesPerPacket * e.packetsWritten),
|
||||||
|
Data: b,
|
||||||
|
}, e.trackId)
|
||||||
|
e.packetsWritten++
|
||||||
|
}
|
||||||
|
|
||||||
seg.Encode(e.writer)
|
seg.Encode(e.writer)
|
||||||
e.seqNumber++
|
e.seqNumber++
|
||||||
|
e.outputBuffer = nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *FormatEncoder) Write(pcm []byte) {
|
func (e *FormatEncoder) Write(pcm []byte) {
|
||||||
|
|
|
@ -30,7 +30,7 @@ func TestEncodeMP4(t *testing.T) {
|
||||||
}
|
}
|
||||||
defer o.Close()
|
defer o.Close()
|
||||||
|
|
||||||
encoder := NewFormatEncoder(o, 44100, 2, 16, false, time.Second)
|
encoder := NewFormatEncoder(o, 44100, 2, 16, false, time.Millisecond*100)
|
||||||
|
|
||||||
iterationSize := 65536
|
iterationSize := 65536
|
||||||
for len(data) > iterationSize {
|
for len(data) > iterationSize {
|
||||||
|
|
Loading…
Reference in a new issue