Browse Source

hls: fix intermittent audio on iOS

pull/764/head v0.17.13
aler9 4 years ago
parent
commit
bb5129d219
  1. 10
      internal/hls/muxer_test.go
  2. 38
      internal/hls/muxer_ts_generator.go

10
internal/hls/muxer_test.go

@ -114,14 +114,18 @@ func TestMuxer(t *testing.T) {
// PES (AAC) // PES (AAC)
checkTSPacket(t, byts, 257, 3) checkTSPacket(t, byts, 257, 3)
byts = byts[177:] byts = byts[166:]
aus, err := aac.DecodeADTS(byts[:11]) aus, err := aac.DecodeADTS(byts[:22])
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, 1, len(aus)) require.Equal(t, 2, len(aus))
require.Equal(t, 2, aus[0].Type) require.Equal(t, 2, aus[0].Type)
require.Equal(t, 44100, aus[0].SampleRate) require.Equal(t, 44100, aus[0].SampleRate)
require.Equal(t, 2, aus[0].ChannelCount) require.Equal(t, 2, aus[0].ChannelCount)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, aus[0].AU) require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, aus[0].AU)
require.Equal(t, 2, aus[1].Type)
require.Equal(t, 44100, aus[1].SampleRate)
require.Equal(t, 2, aus[1].ChannelCount)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, aus[1].AU)
} }
func TestMuxerCloseBeforeFirstSegment(t *testing.T) { func TestMuxerCloseBeforeFirstSegment(t *testing.T) {

38
internal/hls/muxer_ts_generator.go

@ -145,29 +145,29 @@ func (m *muxerTSGenerator) writeAAC(pts time.Duration, aus [][]byte) error {
} }
} }
for _, au := range aus { pkts := make([]*aac.ADTSPacket, len(aus))
enc, err := aac.EncodeADTS([]*aac.ADTSPacket{
{ for i, au := range aus {
Type: m.aacConf.Type, pkts[i] = &aac.ADTSPacket{
SampleRate: m.aacConf.SampleRate, Type: m.aacConf.Type,
ChannelCount: m.aacConf.ChannelCount, SampleRate: m.aacConf.SampleRate,
AU: au, ChannelCount: m.aacConf.ChannelCount,
}, AU: au,
})
if err != nil {
return err
} }
}
err = m.currentSegment.writeAAC(m.startPCR, pts, enc) enc, err := aac.EncodeADTS(pkts)
if err != nil { if err != nil {
return err return err
} }
if m.videoTrack == nil { err = m.currentSegment.writeAAC(m.startPCR, pts, enc)
m.audioAUCount++ if err != nil {
} return err
}
pts += 1000 * time.Second / time.Duration(m.aacConf.SampleRate) if m.videoTrack == nil {
m.audioAUCount += len(aus)
} }
return nil return nil

Loading…
Cancel
Save