mirror of
https://github.com/aler9/gortsplib
synced 2025-10-06 15:46:51 +08:00
add error to NewTrackH264; simplify NewTrackAac
This commit is contained in:
@@ -238,7 +238,8 @@ func TestConnClientPublishUDP(t *testing.T) {
|
|||||||
_, err = conn.Options(u)
|
_, err = conn.Options(u)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
track := NewTrackH264(0, sps, pps)
|
track, err := NewTrackH264(0, sps, pps)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = conn.Announce(u, Tracks{track})
|
_, err = conn.Announce(u, Tracks{track})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -316,7 +317,8 @@ func TestConnClientPublishTCP(t *testing.T) {
|
|||||||
_, err = conn.Options(u)
|
_, err = conn.Options(u)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
track := NewTrackH264(0, sps, pps)
|
track, err := NewTrackH264(0, sps, pps)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = conn.Announce(u, Tracks{track})
|
_, err = conn.Announce(u, Tracks{track})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@@ -94,7 +94,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a H264 track
|
// create a H264 track
|
||||||
track := gortsplib.NewTrackH264(0, sps, pps)
|
track, err := gortsplib.NewTrackH264(0, sps, pps)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
// announce the track
|
// announce the track
|
||||||
_, err = conn.Announce(u, gortsplib.Tracks{track})
|
_, err = conn.Announce(u, gortsplib.Tracks{track})
|
||||||
|
@@ -94,7 +94,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a H264 track
|
// create a H264 track
|
||||||
track := gortsplib.NewTrackH264(0, sps, pps)
|
track, err := gortsplib.NewTrackH264(0, sps, pps)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
// announce the track
|
// announce the track
|
||||||
_, err = conn.Announce(u, gortsplib.Tracks{track})
|
_, err = conn.Announce(u, gortsplib.Tracks{track})
|
||||||
|
1
go.mod
1
go.mod
@@ -4,6 +4,7 @@ go 1.12
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625
|
github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625
|
||||||
|
github.com/notedit/rtmp v0.0.2
|
||||||
github.com/pion/rtcp v1.2.3
|
github.com/pion/rtcp v1.2.3
|
||||||
github.com/pion/rtp v1.6.0
|
github.com/pion/rtp v1.6.0
|
||||||
github.com/stretchr/testify v1.6.1
|
github.com/stretchr/testify v1.6.1
|
||||||
|
2
go.sum
2
go.sum
@@ -2,6 +2,8 @@ github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625 h1:A3upkpYzceQT
|
|||||||
github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625/go.mod h1:5bO/aUQr9m3OasDatNNcVqKAgs7r5hgGXmszWHaC6mI=
|
github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625/go.mod h1:5bO/aUQr9m3OasDatNNcVqKAgs7r5hgGXmszWHaC6mI=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/notedit/rtmp v0.0.2 h1:5+to4yezKATiJgnrcETu9LbV5G/QsWkOV9Ts2M/p33w=
|
||||||
|
github.com/notedit/rtmp v0.0.2/go.mod h1:vzuE21rowz+lT1NGsWbreIvYulgBpCGnQyeTyFblUHc=
|
||||||
github.com/pion/randutil v0.0.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
github.com/pion/randutil v0.0.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
||||||
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
||||||
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
||||||
|
32
track.go
32
track.go
@@ -3,10 +3,12 @@ package gortsplib
|
|||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/aler9/sdp-dirty/v3"
|
"github.com/aler9/sdp-dirty/v3"
|
||||||
|
"github.com/notedit/rtmp/codec/aac"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Track is a track available in a certain URL.
|
// Track is a track available in a certain URL.
|
||||||
@@ -19,7 +21,7 @@ type Track struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewTrackH264 initializes an H264 track.
|
// NewTrackH264 initializes an H264 track.
|
||||||
func NewTrackH264(id int, sps []byte, pps []byte) *Track {
|
func NewTrackH264(id int, sps []byte, pps []byte) (*Track, error) {
|
||||||
spropParameterSets := base64.StdEncoding.EncodeToString(sps) +
|
spropParameterSets := base64.StdEncoding.EncodeToString(sps) +
|
||||||
"," + base64.StdEncoding.EncodeToString(pps)
|
"," + base64.StdEncoding.EncodeToString(pps)
|
||||||
profileLevelId := strings.ToUpper(hex.EncodeToString(sps[1:4]))
|
profileLevelId := strings.ToUpper(hex.EncodeToString(sps[1:4]))
|
||||||
@@ -45,11 +47,31 @@ func NewTrackH264(id int, sps []byte, pps []byte) *Track {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTrackAac initializes an AAC track.
|
// NewTrackAac initializes an AAC track.
|
||||||
func NewTrackAac(id int, sampleRate int, channelCount int, config []byte) *Track {
|
func NewTrackAac(id int, config []byte) (*Track, error) {
|
||||||
|
codec, err := aac.FromMPEG4AudioConfigBytes(config)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
channelCount, err := func() (int, error) {
|
||||||
|
switch codec.Config.ChannelLayout {
|
||||||
|
case aac.CH_MONO:
|
||||||
|
return 1, nil
|
||||||
|
|
||||||
|
case aac.CH_STEREO:
|
||||||
|
return 2, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, fmt.Errorf("unsupported channel count: %v", codec.Config.ChannelLayout)
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &Track{
|
return &Track{
|
||||||
Id: id,
|
Id: id,
|
||||||
Media: &sdp.MediaDescription{
|
Media: &sdp.MediaDescription{
|
||||||
@@ -61,7 +83,7 @@ func NewTrackAac(id int, sampleRate int, channelCount int, config []byte) *Track
|
|||||||
Attributes: []sdp.Attribute{
|
Attributes: []sdp.Attribute{
|
||||||
{
|
{
|
||||||
Key: "rtpmap",
|
Key: "rtpmap",
|
||||||
Value: "97 MPEG4-GENERIC/" + strconv.FormatInt(int64(sampleRate), 10) +
|
Value: "97 MPEG4-GENERIC/" + strconv.FormatInt(int64(codec.Config.SampleRate), 10) +
|
||||||
"/" + strconv.FormatInt(int64(channelCount), 10),
|
"/" + strconv.FormatInt(int64(channelCount), 10),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -75,7 +97,7 @@ func NewTrackAac(id int, sampleRate int, channelCount int, config []byte) *Track
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tracks is a list of tracks.
|
// Tracks is a list of tracks.
|
||||||
|
Reference in New Issue
Block a user