hls: write PMT/PAT tables once at the beginning of every TS segment

This commit is contained in:
aler9 2021-08-14 13:05:42 +02:00
parent eb5bab7e58
commit 5a814480b3
1 changed files with 20 additions and 25 deletions

View File

@ -13,10 +13,10 @@ import (
)
type tsFile struct {
hasVideoTrack bool
name string
buf *multiAccessBuffer
mux *astits.Muxer
pcrTrackIsVideo bool
pcr time.Duration
firstPacketWritten bool
minPTS time.Duration
@ -25,8 +25,9 @@ type tsFile struct {
func newTSFile(hasVideoTrack bool, hasAudioTrack bool) *tsFile {
t := &tsFile{
buf: newMultiAccessBuffer(),
hasVideoTrack: hasVideoTrack,
name: strconv.FormatInt(time.Now().Unix(), 10),
buf: newMultiAccessBuffer(),
}
t.mux = astits.NewMuxer(context.Background(), t.buf)
@ -46,16 +47,15 @@ func newTSFile(hasVideoTrack bool, hasAudioTrack bool) *tsFile {
}
if hasVideoTrack {
t.pcrTrackIsVideo = true
t.mux.SetPCRPID(256)
} else {
t.pcrTrackIsVideo = false
t.mux.SetPCRPID(257)
}
// write PMT at the beginning of every segment
// so no packets are lost
t.mux.WriteTables()
// WriteTable() is called automatically when WriteData() is called with
// - PID == PCRPID
// - AdaptationField != nil
// - RandomAccessIndicator = true
return t
}
@ -77,7 +77,6 @@ func (t *tsFile) newReader() io.Reader {
}
func (t *tsFile) writeH264(dts time.Duration, pts time.Duration, isIDR bool, nalus [][]byte) error {
if t.pcrTrackIsVideo {
if !t.firstPacketWritten {
t.firstPacketWritten = true
t.minPTS = pts
@ -90,7 +89,6 @@ func (t *tsFile) writeH264(dts time.Duration, pts time.Duration, isIDR bool, nal
t.maxPTS = pts
}
}
}
enc, err := h264.EncodeAnnexB(nalus)
if err != nil {
@ -99,11 +97,8 @@ func (t *tsFile) writeH264(dts time.Duration, pts time.Duration, isIDR bool, nal
af := &astits.PacketAdaptationField{
RandomAccessIndicator: isIDR,
}
if t.pcrTrackIsVideo {
af.HasPCR = true
af.PCR = &astits.ClockReference{Base: int64(t.pcr.Seconds() * 90000)}
HasPCR: true,
PCR: &astits.ClockReference{Base: int64(t.pcr.Seconds() * 90000)},
}
_, err = t.mux.WriteData(&astits.MuxerData{
@ -126,7 +121,7 @@ func (t *tsFile) writeH264(dts time.Duration, pts time.Duration, isIDR bool, nal
}
func (t *tsFile) writeAAC(sampleRate int, channelCount int, pts time.Duration, au []byte) error {
if !t.pcrTrackIsVideo {
if !t.hasVideoTrack {
if !t.firstPacketWritten {
t.firstPacketWritten = true
t.minPTS = pts
@ -156,7 +151,7 @@ func (t *tsFile) writeAAC(sampleRate int, channelCount int, pts time.Duration, a
RandomAccessIndicator: true,
}
if !t.pcrTrackIsVideo {
if !t.hasVideoTrack {
af.HasPCR = true
af.PCR = &astits.ClockReference{Base: int64(t.pcr.Seconds() * 90000)}
}