Browse Source

update gortsplib

pull/1088/head
aler9 3 years ago
parent
commit
af7a815f83
  1. 2
      go.mod
  2. 4
      go.sum
  3. 4
      internal/core/hls_muxer.go
  4. 2
      internal/core/hls_source.go
  5. 9
      internal/core/rtmp_conn.go
  6. 8
      internal/hls/client.go
  7. 12
      internal/hls/client_audio_processor.go
  8. 2
      internal/hls/client_test.go
  9. 2
      internal/hls/muxer.go
  10. 4
      internal/hls/muxer_primary_playlist.go
  11. 10
      internal/hls/muxer_test.go
  12. 4
      internal/hls/muxer_variant_fmp4.go
  13. 4
      internal/hls/muxer_variant_fmp4_init.go
  14. 12
      internal/hls/muxer_variant_fmp4_part.go
  15. 4
      internal/hls/muxer_variant_fmp4_playlist.go
  16. 4
      internal/hls/muxer_variant_fmp4_segment.go
  17. 8
      internal/hls/muxer_variant_fmp4_segmenter.go
  18. 2
      internal/hls/muxer_variant_mpegts.go
  19. 10
      internal/hls/muxer_variant_mpegts_segment.go
  20. 4
      internal/hls/muxer_variant_mpegts_segmenter.go
  21. 20
      internal/rtmp/conn.go
  22. 24
      internal/rtmp/conn_test.go

2
go.mod

@ -5,7 +5,7 @@ go 1.17
require ( require (
code.cloudfoundry.org/bytefmt v0.0.0-20211005130812-5bb3c17173e5 code.cloudfoundry.org/bytefmt v0.0.0-20211005130812-5bb3c17173e5
github.com/abema/go-mp4 v0.7.2 github.com/abema/go-mp4 v0.7.2
github.com/aler9/gortsplib v0.0.0-20220724100730-2c8889602c59 github.com/aler9/gortsplib v0.0.0-20220805214011-702cac94a6e9
github.com/asticode/go-astits v1.10.1-0.20220319093903-4abe66a9b757 github.com/asticode/go-astits v1.10.1-0.20220319093903-4abe66a9b757
github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify v1.4.9
github.com/gin-gonic/gin v1.8.1 github.com/gin-gonic/gin v1.8.1

4
go.sum

@ -6,8 +6,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafo
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/aler9/gortsplib v0.0.0-20220724100730-2c8889602c59 h1:t8g7rbQ621GVD06B32H8VqN2+NfW27FIXdVaMI5RQGc= github.com/aler9/gortsplib v0.0.0-20220805214011-702cac94a6e9 h1:VxKfEuGpn99XKz56xBcoj9T2rFMOgkH1kgUhbOsFSDY=
github.com/aler9/gortsplib v0.0.0-20220724100730-2c8889602c59/go.mod h1:WI3nMhY2mM6nfoeW9uyk7TyG5Qr6YnYxmFoCply0sbo= github.com/aler9/gortsplib v0.0.0-20220805214011-702cac94a6e9/go.mod h1:WI3nMhY2mM6nfoeW9uyk7TyG5Qr6YnYxmFoCply0sbo=
github.com/aler9/writerseeker v0.0.0-20220601075008-6f0e685b9c82 h1:9WgSzBLo3a9ToSVV7sRTBYZ1GGOZUpq4+5H3SN0UZq4= github.com/aler9/writerseeker v0.0.0-20220601075008-6f0e685b9c82 h1:9WgSzBLo3a9ToSVV7sRTBYZ1GGOZUpq4+5H3SN0UZq4=
github.com/aler9/writerseeker v0.0.0-20220601075008-6f0e685b9c82/go.mod h1:qsMrZCbeBf/mCLOeF16KDkPu4gktn/pOWyaq1aYQE7U= github.com/aler9/writerseeker v0.0.0-20220601075008-6f0e685b9c82/go.mod h1:qsMrZCbeBf/mCLOeF16KDkPu4gktn/pOWyaq1aYQE7U=
github.com/asticode/go-astikit v0.20.0 h1:+7N+J4E4lWx2QOkRdOf6DafWJMv6O4RRfgClwQokrH8= github.com/asticode/go-astikit v0.20.0 h1:+7N+J4E4lWx2QOkRdOf6DafWJMv6O4RRfgClwQokrH8=

4
internal/core/hls_muxer.go

@ -292,7 +292,7 @@ func (m *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
var videoTrack *gortsplib.TrackH264 var videoTrack *gortsplib.TrackH264
videoTrackID := -1 videoTrackID := -1
var audioTrack *gortsplib.TrackAAC var audioTrack *gortsplib.TrackMPEG4Audio
audioTrackID := -1 audioTrackID := -1
var aacDecoder *rtpaac.Decoder var aacDecoder *rtpaac.Decoder
@ -306,7 +306,7 @@ func (m *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
videoTrack = tt videoTrack = tt
videoTrackID = i videoTrackID = i
case *gortsplib.TrackAAC: case *gortsplib.TrackMPEG4Audio:
if audioTrack != nil { if audioTrack != nil {
return fmt.Errorf("can't encode track %d with HLS: too many tracks", i+1) return fmt.Errorf("can't encode track %d with HLS: too many tracks", i+1)
} }

2
internal/core/hls_source.go

@ -55,7 +55,7 @@ func (s *hlsSource) run(ctx context.Context) error {
} }
}() }()
onTracks := func(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC) error { onTracks := func(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackMPEG4Audio) error {
var tracks gortsplib.Tracks var tracks gortsplib.Tracks
if videoTrack != nil { if videoTrack != nil {

9
internal/core/rtmp_conn.go

@ -11,8 +11,8 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac"
"github.com/aler9/gortsplib/pkg/h264" "github.com/aler9/gortsplib/pkg/h264"
"github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/aler9/gortsplib/pkg/ringbuffer" "github.com/aler9/gortsplib/pkg/ringbuffer"
"github.com/aler9/gortsplib/pkg/rtpaac" "github.com/aler9/gortsplib/pkg/rtpaac"
"github.com/aler9/gortsplib/pkg/rtph264" "github.com/aler9/gortsplib/pkg/rtph264"
@ -254,7 +254,7 @@ func (c *rtmpConn) runRead(ctx context.Context, u *url.URL) error {
var videoTrack *gortsplib.TrackH264 var videoTrack *gortsplib.TrackH264
videoTrackID := -1 videoTrackID := -1
var audioTrack *gortsplib.TrackAAC var audioTrack *gortsplib.TrackMPEG4Audio
audioTrackID := -1 audioTrackID := -1
var aacDecoder *rtpaac.Decoder var aacDecoder *rtpaac.Decoder
@ -268,7 +268,7 @@ func (c *rtmpConn) runRead(ctx context.Context, u *url.URL) error {
videoTrack = tt videoTrack = tt
videoTrackID = i videoTrackID = i
case *gortsplib.TrackAAC: case *gortsplib.TrackMPEG4Audio:
if audioTrack != nil { if audioTrack != nil {
return fmt.Errorf("can't read track %d with RTMP: too many tracks", i+1) return fmt.Errorf("can't read track %d with RTMP: too many tracks", i+1)
} }
@ -469,7 +469,8 @@ func (c *rtmpConn) runRead(ctx context.Context, u *url.URL) error {
Channels: flvio.SOUND_STEREO, Channels: flvio.SOUND_STEREO,
AACType: flvio.AAC_RAW, AACType: flvio.AAC_RAW,
Payload: au, Payload: au,
DTS: pts + time.Duration(i)*aac.SamplesPerAccessUnit*time.Second/time.Duration(audioTrack.ClockRate()), DTS: pts + time.Duration(i)*mpeg4audio.SamplesPerAccessUnit*
time.Second/time.Duration(audioTrack.ClockRate()),
}) })
if err != nil { if err != nil {
return err return err

8
internal/hls/client.go

@ -46,7 +46,7 @@ type ClientLogger interface {
// Client is a HLS client. // Client is a HLS client.
type Client struct { type Client struct {
onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error onTracks func(*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio) error
onVideoData func(time.Duration, [][]byte) onVideoData func(time.Duration, [][]byte)
onAudioData func(time.Duration, [][]byte) onAudioData func(time.Duration, [][]byte)
logger ClientLogger logger ClientLogger
@ -70,7 +70,7 @@ type Client struct {
tracksMutex sync.RWMutex tracksMutex sync.RWMutex
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
// in // in
allocateProcs chan clientAllocateProcsReq allocateProcs chan clientAllocateProcsReq
@ -83,7 +83,7 @@ type Client struct {
func NewClient( func NewClient(
primaryPlaylistURLStr string, primaryPlaylistURLStr string,
fingerprint string, fingerprint string,
onTracks func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error, onTracks func(*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio) error,
onVideoData func(time.Duration, [][]byte), onVideoData func(time.Duration, [][]byte),
onAudioData func(time.Duration, [][]byte), onAudioData func(time.Duration, [][]byte),
logger ClientLogger, logger ClientLogger,
@ -536,7 +536,7 @@ func (c *Client) onVideoProcessorData(pts time.Duration, nalus [][]byte) {
c.onVideoData(pts, nalus) c.onVideoData(pts, nalus)
} }
func (c *Client) onAudioProcessorTrack(track *gortsplib.TrackAAC) error { func (c *Client) onAudioProcessorTrack(track *gortsplib.TrackMPEG4Audio) error {
c.tracksMutex.Lock() c.tracksMutex.Lock()
defer c.tracksMutex.Unlock() defer c.tracksMutex.Unlock()

12
internal/hls/client_audio_processor.go

@ -6,7 +6,7 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac" "github.com/aler9/gortsplib/pkg/mpeg4audio"
) )
type clientAudioProcessorData struct { type clientAudioProcessorData struct {
@ -16,7 +16,7 @@ type clientAudioProcessorData struct {
type clientAudioProcessor struct { type clientAudioProcessor struct {
ctx context.Context ctx context.Context
onTrack func(*gortsplib.TrackAAC) error onTrack func(*gortsplib.TrackMPEG4Audio) error
onData func(time.Duration, [][]byte) onData func(time.Duration, [][]byte)
trackInitialized bool trackInitialized bool
@ -26,7 +26,7 @@ type clientAudioProcessor struct {
func newClientAudioProcessor( func newClientAudioProcessor(
ctx context.Context, ctx context.Context,
onTrack func(*gortsplib.TrackAAC) error, onTrack func(*gortsplib.TrackMPEG4Audio) error,
onData func(time.Duration, [][]byte), onData func(time.Duration, [][]byte),
) *clientAudioProcessor { ) *clientAudioProcessor {
p := &clientAudioProcessor{ p := &clientAudioProcessor{
@ -58,7 +58,7 @@ func (p *clientAudioProcessor) doProcess(
data []byte, data []byte,
pts time.Duration, pts time.Duration,
) error { ) error {
var adtsPkts aac.ADTSPackets var adtsPkts mpeg4audio.ADTSPackets
err := adtsPkts.Unmarshal(data) err := adtsPkts.Unmarshal(data)
if err != nil { if err != nil {
return err return err
@ -79,9 +79,9 @@ func (p *clientAudioProcessor) doProcess(
if !p.trackInitialized { if !p.trackInitialized {
p.trackInitialized = true p.trackInitialized = true
track := &gortsplib.TrackAAC{ track := &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: pkt.Type, Type: pkt.Type,
SampleRate: pkt.SampleRate, SampleRate: pkt.SampleRate,
ChannelCount: pkt.ChannelCount, ChannelCount: pkt.ChannelCount,

2
internal/hls/client_test.go

@ -214,7 +214,7 @@ func TestClient(t *testing.T) {
c, err := NewClient( c, err := NewClient(
prefix+"://localhost:5780/stream.m3u8", prefix+"://localhost:5780/stream.m3u8",
"33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739", "33949E05FFFB5FF3E8AA16F8213A6251B4D9363804BA53233C4DA9A46D6F2739",
func(*gortsplib.TrackH264, *gortsplib.TrackAAC) error { func(*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio) error {
return nil return nil
}, },
func(pts time.Duration, nalus [][]byte) { func(pts time.Duration, nalus [][]byte) {

2
internal/hls/muxer.go

@ -28,7 +28,7 @@ func NewMuxer(
partDuration time.Duration, partDuration time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
) (*Muxer, error) { ) (*Muxer, error) {
m := &Muxer{} m := &Muxer{}

4
internal/hls/muxer_primary_playlist.go

@ -14,13 +14,13 @@ import (
type muxerPrimaryPlaylist struct { type muxerPrimaryPlaylist struct {
fmp4 bool fmp4 bool
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
} }
func newMuxerPrimaryPlaylist( func newMuxerPrimaryPlaylist(
fmp4 bool, fmp4 bool,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
) *muxerPrimaryPlaylist { ) *muxerPrimaryPlaylist {
return &muxerPrimaryPlaylist{ return &muxerPrimaryPlaylist{
fmp4: fmp4, fmp4: fmp4,

10
internal/hls/muxer_test.go

@ -9,7 +9,7 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac" "github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/asticode/go-astits" "github.com/asticode/go-astits"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -29,9 +29,9 @@ func TestMuxerVideoAudio(t *testing.T) {
PPS: []byte{0x08}, PPS: []byte{0x08},
} }
audioTrack := &gortsplib.TrackAAC{ audioTrack := &gortsplib.TrackMPEG4Audio{
PayloadType: 97, PayloadType: 97,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -282,9 +282,9 @@ func TestMuxerVideoOnly(t *testing.T) {
} }
func TestMuxerAudioOnly(t *testing.T) { func TestMuxerAudioOnly(t *testing.T) {
audioTrack := &gortsplib.TrackAAC{ audioTrack := &gortsplib.TrackMPEG4Audio{
PayloadType: 97, PayloadType: 97,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,

4
internal/hls/muxer_variant_fmp4.go

@ -40,7 +40,7 @@ type muxerVariantFMP4 struct {
playlist *muxerVariantFMP4Playlist playlist *muxerVariantFMP4Playlist
segmenter *muxerVariantFMP4Segmenter segmenter *muxerVariantFMP4Segmenter
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
mutex sync.Mutex mutex sync.Mutex
videoLastSPS []byte videoLastSPS []byte
@ -55,7 +55,7 @@ func newMuxerVariantFMP4(
partDuration time.Duration, partDuration time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
) *muxerVariantFMP4 { ) *muxerVariantFMP4 {
v := &muxerVariantFMP4{ v := &muxerVariantFMP4{
videoTrack: videoTrack, videoTrack: videoTrack,

4
internal/hls/muxer_variant_fmp4_init.go

@ -265,7 +265,7 @@ func mp4InitGenerateVideoTrack(w *mp4.Writer, trackID int, videoTrack *gortsplib
return nil return nil
} }
func mp4InitGenerateAudioTrack(w *mp4.Writer, trackID int, audioTrack *gortsplib.TrackAAC) error { func mp4InitGenerateAudioTrack(w *mp4.Writer, trackID int, audioTrack *gortsplib.TrackMPEG4Audio) error {
/* /*
trak trak
- tkhd - tkhd
@ -511,7 +511,7 @@ func mp4InitGenerateAudioTrack(w *mp4.Writer, trackID int, audioTrack *gortsplib
return nil return nil
} }
func mp4InitGenerate(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC) ([]byte, error) { func mp4InitGenerate(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackMPEG4Audio) ([]byte, error) {
/* /*
- ftyp - ftyp
- moov - moov

12
internal/hls/muxer_variant_fmp4_part.go

@ -9,7 +9,7 @@ import (
gomp4 "github.com/abema/go-mp4" gomp4 "github.com/abema/go-mp4"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac" "github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/aler9/rtsp-simple-server/internal/mp4" "github.com/aler9/rtsp-simple-server/internal/mp4"
) )
@ -105,7 +105,7 @@ func mp4PartGenerateVideoTraf(
func mp4PartGenerateAudioTraf( func mp4PartGenerateAudioTraf(
w *mp4.Writer, w *mp4.Writer,
trackID int, trackID int,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
audioSamples []*fmp4AudioSample, audioSamples []*fmp4AudioSample,
) (*gomp4.Trun, int, error) { ) (*gomp4.Trun, int, error) {
/* /*
@ -182,7 +182,7 @@ func mp4PartGenerateAudioTraf(
func mp4PartGenerate( func mp4PartGenerate(
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
videoSamples []*fmp4VideoSample, videoSamples []*fmp4VideoSample,
audioSamples []*fmp4AudioSample, audioSamples []*fmp4AudioSample,
) ([]byte, error) { ) ([]byte, error) {
@ -301,7 +301,7 @@ func fmp4PartName(id uint64) string {
type muxerVariantFMP4Part struct { type muxerVariantFMP4Part struct {
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
id uint64 id uint64
isIndependent bool isIndependent bool
@ -313,7 +313,7 @@ type muxerVariantFMP4Part struct {
func newMuxerVariantFMP4Part( func newMuxerVariantFMP4Part(
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
id uint64, id uint64,
) *muxerVariantFMP4Part { ) *muxerVariantFMP4Part {
p := &muxerVariantFMP4Part{ p := &muxerVariantFMP4Part{
@ -350,7 +350,7 @@ func (p *muxerVariantFMP4Part) duration() time.Duration {
// not the real duration, // not the real duration,
// otherwise on iPhone iOS the stream freezes. // otherwise on iPhone iOS the stream freezes.
return time.Duration(len(p.audioSamples)) * time.Second * return time.Duration(len(p.audioSamples)) * time.Second *
time.Duration(aac.SamplesPerAccessUnit) / time.Duration(p.audioTrack.ClockRate()) time.Duration(mpeg4audio.SamplesPerAccessUnit) / time.Duration(p.audioTrack.ClockRate())
} }
func (p *muxerVariantFMP4Part) finalize() error { func (p *muxerVariantFMP4Part) finalize() error {

4
internal/hls/muxer_variant_fmp4_playlist.go

@ -71,7 +71,7 @@ type muxerVariantFMP4Playlist struct {
lowLatency bool lowLatency bool
segmentCount int segmentCount int
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
mutex sync.Mutex mutex sync.Mutex
cond *sync.Cond cond *sync.Cond
@ -90,7 +90,7 @@ func newMuxerVariantFMP4Playlist(
lowLatency bool, lowLatency bool,
segmentCount int, segmentCount int,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
) *muxerVariantFMP4Playlist { ) *muxerVariantFMP4Playlist {
p := &muxerVariantFMP4Playlist{ p := &muxerVariantFMP4Playlist{
lowLatency: lowLatency, lowLatency: lowLatency,

4
internal/hls/muxer_variant_fmp4_segment.go

@ -46,7 +46,7 @@ type muxerVariantFMP4Segment struct {
startDTS time.Duration startDTS time.Duration
segmentMaxSize uint64 segmentMaxSize uint64
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
genPartID func() uint64 genPartID func() uint64
onPartFinalized func(*muxerVariantFMP4Part) onPartFinalized func(*muxerVariantFMP4Part)
@ -63,7 +63,7 @@ func newMuxerVariantFMP4Segment(
startDTS time.Duration, startDTS time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
genPartID func() uint64, genPartID func() uint64,
onPartFinalized func(*muxerVariantFMP4Part), onPartFinalized func(*muxerVariantFMP4Part),
) *muxerVariantFMP4Segment { ) *muxerVariantFMP4Segment {

8
internal/hls/muxer_variant_fmp4_segmenter.go

@ -5,8 +5,8 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac"
"github.com/aler9/gortsplib/pkg/h264" "github.com/aler9/gortsplib/pkg/h264"
"github.com/aler9/gortsplib/pkg/mpeg4audio"
) )
func partDurationIsCompatible(partDuration time.Duration, sampleDuration time.Duration) bool { func partDurationIsCompatible(partDuration time.Duration, sampleDuration time.Duration) bool {
@ -50,7 +50,7 @@ type muxerVariantFMP4Segmenter struct {
partDuration time.Duration partDuration time.Duration
segmentMaxSize uint64 segmentMaxSize uint64
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
onSegmentFinalized func(*muxerVariantFMP4Segment) onSegmentFinalized func(*muxerVariantFMP4Segment)
onPartFinalized func(*muxerVariantFMP4Part) onPartFinalized func(*muxerVariantFMP4Part)
@ -75,7 +75,7 @@ func newMuxerVariantFMP4Segmenter(
partDuration time.Duration, partDuration time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
onSegmentFinalized func(*muxerVariantFMP4Segment), onSegmentFinalized func(*muxerVariantFMP4Segment),
onPartFinalized func(*muxerVariantFMP4Part), onPartFinalized func(*muxerVariantFMP4Part),
) *muxerVariantFMP4Segmenter { ) *muxerVariantFMP4Segmenter {
@ -261,7 +261,7 @@ func (m *muxerVariantFMP4Segmenter) writeH264Entry(sample *fmp4VideoSample) erro
func (m *muxerVariantFMP4Segmenter) writeAAC(pts time.Duration, aus [][]byte) error { func (m *muxerVariantFMP4Segmenter) writeAAC(pts time.Duration, aus [][]byte) error {
for i, au := range aus { for i, au := range aus {
err := m.writeAACEntry(&fmp4AudioSample{ err := m.writeAACEntry(&fmp4AudioSample{
pts: pts + time.Duration(i)*aac.SamplesPerAccessUnit*time.Second/time.Duration(m.audioTrack.ClockRate()), pts: pts + time.Duration(i)*mpeg4audio.SamplesPerAccessUnit*time.Second/time.Duration(m.audioTrack.ClockRate()),
au: au, au: au,
}) })
if err != nil { if err != nil {

2
internal/hls/muxer_variant_mpegts.go

@ -16,7 +16,7 @@ func newMuxerVariantMPEGTS(
segmentDuration time.Duration, segmentDuration time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
) *muxerVariantMPEGTS { ) *muxerVariantMPEGTS {
v := &muxerVariantMPEGTS{} v := &muxerVariantMPEGTS{}

10
internal/hls/muxer_variant_mpegts_segment.go

@ -8,8 +8,8 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac"
"github.com/aler9/gortsplib/pkg/h264" "github.com/aler9/gortsplib/pkg/h264"
"github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/asticode/go-astits" "github.com/asticode/go-astits"
) )
@ -20,7 +20,7 @@ const (
type muxerVariantMPEGTSSegment struct { type muxerVariantMPEGTSSegment struct {
segmentMaxSize uint64 segmentMaxSize uint64
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
writeData func(*astits.MuxerData) (int, error) writeData func(*astits.MuxerData) (int, error)
startTime time.Time startTime time.Time
@ -36,7 +36,7 @@ func newMuxerVariantMPEGTSSegment(
startTime time.Time, startTime time.Time,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
writeData func(*astits.MuxerData) (int, error), writeData func(*astits.MuxerData) (int, error),
) *muxerVariantMPEGTSSegment { ) *muxerVariantMPEGTSSegment {
t := &muxerVariantMPEGTSSegment{ t := &muxerVariantMPEGTSSegment{
@ -147,10 +147,10 @@ func (t *muxerVariantMPEGTSSegment) writeAAC(
pts time.Duration, pts time.Duration,
aus [][]byte, aus [][]byte,
) error { ) error {
pkts := make(aac.ADTSPackets, len(aus)) pkts := make(mpeg4audio.ADTSPackets, len(aus))
for i, au := range aus { for i, au := range aus {
pkts[i] = &aac.ADTSPacket{ pkts[i] = &mpeg4audio.ADTSPacket{
Type: t.audioTrack.Config.Type, Type: t.audioTrack.Config.Type,
SampleRate: t.audioTrack.Config.SampleRate, SampleRate: t.audioTrack.Config.SampleRate,
ChannelCount: t.audioTrack.Config.ChannelCount, ChannelCount: t.audioTrack.Config.ChannelCount,

4
internal/hls/muxer_variant_mpegts_segmenter.go

@ -23,7 +23,7 @@ type muxerVariantMPEGTSSegmenter struct {
segmentDuration time.Duration segmentDuration time.Duration
segmentMaxSize uint64 segmentMaxSize uint64
videoTrack *gortsplib.TrackH264 videoTrack *gortsplib.TrackH264
audioTrack *gortsplib.TrackAAC audioTrack *gortsplib.TrackMPEG4Audio
onSegmentReady func(*muxerVariantMPEGTSSegment) onSegmentReady func(*muxerVariantMPEGTSSegment)
writer *astits.Muxer writer *astits.Muxer
@ -37,7 +37,7 @@ func newMuxerVariantMPEGTSSegmenter(
segmentDuration time.Duration, segmentDuration time.Duration,
segmentMaxSize uint64, segmentMaxSize uint64,
videoTrack *gortsplib.TrackH264, videoTrack *gortsplib.TrackH264,
audioTrack *gortsplib.TrackAAC, audioTrack *gortsplib.TrackMPEG4Audio,
onSegmentReady func(*muxerVariantMPEGTSSegment), onSegmentReady func(*muxerVariantMPEGTSSegment),
) *muxerVariantMPEGTSSegmenter { ) *muxerVariantMPEGTSSegmenter {
m := &muxerVariantMPEGTSSegmenter{ m := &muxerVariantMPEGTSSegmenter{

20
internal/rtmp/conn.go

@ -9,7 +9,7 @@ import (
"time" "time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac" "github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/notedit/rtmp/format/flv/flvio" "github.com/notedit/rtmp/format/flv/flvio"
"github.com/aler9/rtsp-simple-server/internal/rtmp/bytecounter" "github.com/aler9/rtsp-simple-server/internal/rtmp/bytecounter"
@ -588,14 +588,14 @@ func trackFromH264DecoderConfig(data []byte) (*gortsplib.TrackH264, error) {
}, nil }, nil
} }
func trackFromAACDecoderConfig(data []byte) (*gortsplib.TrackAAC, error) { func trackFromAACDecoderConfig(data []byte) (*gortsplib.TrackMPEG4Audio, error) {
var mpegConf aac.MPEG4AudioConfig var mpegConf mpeg4audio.Config
err := mpegConf.Unmarshal(data) err := mpegConf.Unmarshal(data)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &gortsplib.TrackAAC{ return &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &mpegConf, Config: &mpegConf,
SizeLength: 13, SizeLength: 13,
@ -606,7 +606,7 @@ func trackFromAACDecoderConfig(data []byte) (*gortsplib.TrackAAC, error) {
var errEmptyMetadata = errors.New("metadata is empty") var errEmptyMetadata = errors.New("metadata is empty")
func (c *Conn) readTracksFromMetadata(payload []interface{}) (*gortsplib.TrackH264, *gortsplib.TrackAAC, error) { func (c *Conn) readTracksFromMetadata(payload []interface{}) (*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio, error) {
if len(payload) != 1 { if len(payload) != 1 {
return nil, nil, fmt.Errorf("invalid metadata") return nil, nil, fmt.Errorf("invalid metadata")
} }
@ -677,7 +677,7 @@ func (c *Conn) readTracksFromMetadata(payload []interface{}) (*gortsplib.TrackH2
} }
var videoTrack *gortsplib.TrackH264 var videoTrack *gortsplib.TrackH264
var audioTrack *gortsplib.TrackAAC var audioTrack *gortsplib.TrackMPEG4Audio
for { for {
msg, err := c.ReadMessage() msg, err := c.ReadMessage()
@ -726,10 +726,10 @@ func (c *Conn) readTracksFromMetadata(payload []interface{}) (*gortsplib.TrackH2
} }
} }
func (c *Conn) readTracksFromMessages(msg message.Message) (*gortsplib.TrackH264, *gortsplib.TrackAAC, error) { func (c *Conn) readTracksFromMessages(msg message.Message) (*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio, error) {
var startTime *time.Duration var startTime *time.Duration
var videoTrack *gortsplib.TrackH264 var videoTrack *gortsplib.TrackH264
var audioTrack *gortsplib.TrackAAC var audioTrack *gortsplib.TrackMPEG4Audio
// analyze 1 second of packets // analyze 1 second of packets
outer: outer:
@ -801,7 +801,7 @@ outer:
} }
// ReadTracks reads track informations. // ReadTracks reads track informations.
func (c *Conn) ReadTracks() (*gortsplib.TrackH264, *gortsplib.TrackAAC, error) { func (c *Conn) ReadTracks() (*gortsplib.TrackH264, *gortsplib.TrackMPEG4Audio, error) {
msg, err := c.ReadMessage() msg, err := c.ReadMessage()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -844,7 +844,7 @@ func (c *Conn) ReadTracks() (*gortsplib.TrackH264, *gortsplib.TrackAAC, error) {
} }
// WriteTracks writes track informations. // WriteTracks writes track informations.
func (c *Conn) WriteTracks(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackAAC) error { func (c *Conn) WriteTracks(videoTrack *gortsplib.TrackH264, audioTrack *gortsplib.TrackMPEG4Audio) error {
err := c.WriteMessage(&message.MsgDataAMF0{ err := c.WriteMessage(&message.MsgDataAMF0{
ChunkStreamID: 4, ChunkStreamID: 4,
MessageStreamID: 0x1000000, MessageStreamID: 0x1000000,

24
internal/rtmp/conn_test.go

@ -6,7 +6,7 @@ import (
"testing" "testing"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/aac" "github.com/aler9/gortsplib/pkg/mpeg4audio"
"github.com/notedit/rtmp/format/flv/flvio" "github.com/notedit/rtmp/format/flv/flvio"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -525,9 +525,9 @@ func TestReadTracks(t *testing.T) {
PPS: pps, PPS: pps,
}, videoTrack) }, videoTrack)
require.Equal(t, &gortsplib.TrackAAC{ require.Equal(t, &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -544,9 +544,9 @@ func TestReadTracks(t *testing.T) {
PPS: pps, PPS: pps,
}, videoTrack) }, videoTrack)
require.Equal(t, &gortsplib.TrackAAC{ require.Equal(t, &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -563,9 +563,9 @@ func TestReadTracks(t *testing.T) {
PPS: pps, PPS: pps,
}, videoTrack) }, videoTrack)
require.Equal(t, &gortsplib.TrackAAC{ require.Equal(t, &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -784,7 +784,7 @@ func TestReadTracks(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// C->S AAC decoder config // C->S AAC decoder config
enc, err := aac.MPEG4AudioConfig{ enc, err := mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -842,7 +842,7 @@ func TestReadTracks(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// C->S AAC decoder config // C->S AAC decoder config
enc, err := aac.MPEG4AudioConfig{ enc, err := mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -875,7 +875,7 @@ func TestReadTracks(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// C->S AAC decoder config // C->S AAC decoder config
enc, err := aac.MPEG4AudioConfig{ enc, err := mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,
@ -924,9 +924,9 @@ func TestWriteTracks(t *testing.T) {
}, },
} }
audioTrack := &gortsplib.TrackAAC{ audioTrack := &gortsplib.TrackMPEG4Audio{
PayloadType: 96, PayloadType: 96,
Config: &aac.MPEG4AudioConfig{ Config: &mpeg4audio.Config{
Type: 2, Type: 2,
SampleRate: 44100, SampleRate: 44100,
ChannelCount: 2, ChannelCount: 2,

Loading…
Cancel
Save