test m4s to hls ll
This commit is contained in:
parent
d6080d8287
commit
b0aae43f10
@ -307,7 +307,46 @@ func (element *Muxer) WritePacket(pkt av.Packet, GOP bool) (bool, []byte, error)
|
|||||||
}
|
}
|
||||||
return got, buf, err
|
return got, buf, err
|
||||||
}
|
}
|
||||||
|
func (element *Muxer) WritePacket4(pkt av.Packet) error {
|
||||||
|
stream := element.streams[pkt.Idx]
|
||||||
|
return stream.writePacketV4(pkt)
|
||||||
|
}
|
||||||
|
func (element *Stream) writePacketV4(pkt av.Packet) error {
|
||||||
|
trackID := pkt.Idx + 1
|
||||||
|
if element.sampleIndex == 0 {
|
||||||
|
element.moof.Header = &mp4fio.MovieFragHeader{Seqnum: uint32(element.muxer.fragmentIndex + 1)}
|
||||||
|
element.moof.Tracks = []*mp4fio.TrackFrag{
|
||||||
|
&mp4fio.TrackFrag{
|
||||||
|
Header: &mp4fio.TrackFragHeader{
|
||||||
|
Data: []byte{0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, uint8(trackID), 0x01, 0x01, 0x00, 0x00},
|
||||||
|
},
|
||||||
|
DecodeTime: &mp4fio.TrackFragDecodeTime{
|
||||||
|
Version: 1,
|
||||||
|
Flags: 0,
|
||||||
|
Time: uint64(element.timeToTs(pkt.Time)),
|
||||||
|
},
|
||||||
|
Run: &mp4fio.TrackFragRun{
|
||||||
|
Flags: 0x000b05,
|
||||||
|
FirstSampleFlags: 0x02000000,
|
||||||
|
DataOffset: 0,
|
||||||
|
Entries: []mp4io.TrackFragRunEntry{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
element.buffer = []byte{0x00, 0x00, 0x00, 0x00, 0x6d, 0x64, 0x61, 0x74}
|
||||||
|
}
|
||||||
|
runEnrty := mp4io.TrackFragRunEntry{
|
||||||
|
Duration: uint32(element.timeToTs(pkt.Duration)),
|
||||||
|
Size: uint32(len(pkt.Data)),
|
||||||
|
Cts: uint32(element.timeToTs(pkt.CompositionTime)),
|
||||||
|
}
|
||||||
|
element.moof.Tracks[0].Run.Entries = append(element.moof.Tracks[0].Run.Entries, runEnrty)
|
||||||
|
element.buffer = append(element.buffer, pkt.Data...)
|
||||||
|
element.sampleIndex++
|
||||||
|
element.dts += element.timeToTs(pkt.Duration)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func (element *Stream) writePacketV3(pkt av.Packet, rawdur time.Duration, maxFrames int) (bool, []byte, error) {
|
func (element *Stream) writePacketV3(pkt av.Packet, rawdur time.Duration, maxFrames int) (bool, []byte, error) {
|
||||||
trackID := pkt.Idx + 1
|
trackID := pkt.Idx + 1
|
||||||
var out []byte
|
var out []byte
|
||||||
@ -355,9 +394,27 @@ func (element *Stream) writePacketV3(pkt av.Packet, rawdur time.Duration, maxFra
|
|||||||
element.dts += element.timeToTs(rawdur)
|
element.dts += element.timeToTs(rawdur)
|
||||||
return got, out, nil
|
return got, out, nil
|
||||||
}
|
}
|
||||||
|
func (element *Muxer) Finalize() []byte {
|
||||||
|
stream := element.streams[0]
|
||||||
|
stream.moof.Tracks[0].Run.DataOffset = uint32(stream.moof.Len() + 8)
|
||||||
|
out := make([]byte, stream.moof.Len()+len(stream.buffer))
|
||||||
|
stream.moof.Marshal(out)
|
||||||
|
PutU32BE(stream.buffer, uint32(len(stream.buffer)))
|
||||||
|
copy(out[stream.moof.Len():], stream.buffer)
|
||||||
|
stream.sampleIndex = 0
|
||||||
|
stream.muxer.fragmentIndex++
|
||||||
|
return out
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//PutU32BE func
|
||||||
|
func PutU32BE(b []byte, v uint32) {
|
||||||
|
b[0] = byte(v >> 24)
|
||||||
|
b[1] = byte(v >> 16)
|
||||||
|
b[2] = byte(v >> 8)
|
||||||
|
b[3] = byte(v)
|
||||||
|
}
|
||||||
func (element *Stream) writePacketV2(pkt av.Packet, rawdur time.Duration, maxFrames int) (bool, []byte, error) {
|
func (element *Stream) writePacketV2(pkt av.Packet, rawdur time.Duration, maxFrames int) (bool, []byte, error) {
|
||||||
//pkt.Data = pkt.Data[4:]
|
|
||||||
trackID := pkt.Idx + 1
|
trackID := pkt.Idx + 1
|
||||||
if element.sampleIndex == 0 {
|
if element.sampleIndex == 0 {
|
||||||
element.moof.Header = &mp4fio.MovieFragHeader{Seqnum: uint32(element.muxer.fragmentIndex + 1)}
|
element.moof.Header = &mp4fio.MovieFragHeader{Seqnum: uint32(element.muxer.fragmentIndex + 1)}
|
||||||
|
@ -169,7 +169,6 @@ func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
|
|||||||
switch stream.Type() {
|
switch stream.Type() {
|
||||||
case av.AAC:
|
case av.AAC:
|
||||||
codec := stream.CodecData.(aacparser.CodecData)
|
codec := stream.CodecData.(aacparser.CodecData)
|
||||||
|
|
||||||
n := tsio.FillPESHeader(self.peshdr, tsio.StreamIdAAC, len(self.adtshdr)+len(pkt.Data), pkt.Time, 0)
|
n := tsio.FillPESHeader(self.peshdr, tsio.StreamIdAAC, len(self.adtshdr)+len(pkt.Data), pkt.Time, 0)
|
||||||
self.datav[0] = self.peshdr[:n]
|
self.datav[0] = self.peshdr[:n]
|
||||||
aacparser.FillADTSHeader(self.adtshdr, codec.Config, 1024, len(pkt.Data))
|
aacparser.FillADTSHeader(self.adtshdr, codec.Config, 1024, len(pkt.Data))
|
||||||
|
Loading…
Reference in New Issue
Block a user