mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-10-21 14:49:36 +08:00
update gortsplib
This commit is contained in:
2
go.mod
2
go.mod
@@ -5,7 +5,7 @@ go 1.16
|
||||
require (
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
||||
github.com/aler9/gortsplib v0.0.0-20210923181911-321fe06c6dab
|
||||
github.com/aler9/gortsplib v0.0.0-20210928133338-9f4f3054daa7
|
||||
github.com/asticode/go-astits v1.9.0
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/gin-gonic/gin v1.7.2
|
||||
|
4
go.sum
4
go.sum
@@ -2,8 +2,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/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/aler9/gortsplib v0.0.0-20210923181911-321fe06c6dab h1:Dp3zUKCN/74UdxYBvHNKJubuYZeesDDCAB4gx6wZYh4=
|
||||
github.com/aler9/gortsplib v0.0.0-20210923181911-321fe06c6dab/go.mod h1:DKI+t4Wj5YjkpxmiQhmG3qRG5VMOprDQvto62wMO68c=
|
||||
github.com/aler9/gortsplib v0.0.0-20210928133338-9f4f3054daa7 h1:PGGpgZejUm7y95ai31cz3XMfwITWu/+xkQoPS4qq+io=
|
||||
github.com/aler9/gortsplib v0.0.0-20210928133338-9f4f3054daa7/go.mod h1:DKI+t4Wj5YjkpxmiQhmG3qRG5VMOprDQvto62wMO68c=
|
||||
github.com/aler9/rtmp v0.0.0-20210403095203-3be4a5535927 h1:95mXJ5fUCYpBRdSOnLAQAdJHHKxxxJrVCiaqDi965YQ=
|
||||
github.com/aler9/rtmp v0.0.0-20210403095203-3be4a5535927/go.mod h1:vzuE21rowz+lT1NGsWbreIvYulgBpCGnQyeTyFblUHc=
|
||||
github.com/asticode/go-astikit v0.20.0 h1:+7N+J4E4lWx2QOkRdOf6DafWJMv6O4RRfgClwQokrH8=
|
||||
|
@@ -319,8 +319,6 @@ func (r *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
|
||||
writerDone := make(chan error)
|
||||
go func() {
|
||||
writerDone <- func() error {
|
||||
var videoBuf [][]byte
|
||||
|
||||
for {
|
||||
data, ok := r.ringBuffer.Pull()
|
||||
if !ok {
|
||||
@@ -336,27 +334,20 @@ func (r *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
|
||||
continue
|
||||
}
|
||||
|
||||
nalus, pts, err := h264Decoder.DecodeRTP(&pkt)
|
||||
nalus, pts, err := h264Decoder.DecodeUntilMarker(&pkt)
|
||||
if err != nil {
|
||||
if err != rtph264.ErrMorePacketsNeeded && err != rtph264.ErrNonStartingPacketAndNoPrevious {
|
||||
if err != rtph264.ErrMorePacketsNeeded &&
|
||||
err != rtph264.ErrNonStartingPacketAndNoPrevious {
|
||||
r.log(logger.Warn, "unable to decode video track: %v", err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
videoBuf = append(videoBuf, nalus...)
|
||||
|
||||
// RTP marker means that all the NALUs with the same PTS have been received.
|
||||
// send them together.
|
||||
if pkt.Marker {
|
||||
err := r.muxer.WriteH264(pts, videoBuf)
|
||||
err = r.muxer.WriteH264(pts, nalus)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
videoBuf = nil
|
||||
}
|
||||
|
||||
} else if audioTrack != nil && pair.trackID == audioTrackID {
|
||||
var pkt rtp.Packet
|
||||
err := pkt.Unmarshal(pair.buf)
|
||||
@@ -365,7 +356,7 @@ func (r *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
|
||||
continue
|
||||
}
|
||||
|
||||
aus, pts, err := aacDecoder.DecodeRTP(&pkt)
|
||||
aus, pts, err := aacDecoder.Decode(&pkt)
|
||||
if err != nil {
|
||||
if err != rtpaac.ErrMorePacketsNeeded {
|
||||
r.log(logger.Warn, "unable to decode audio track: %v", err)
|
||||
|
@@ -280,7 +280,6 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
// disable read deadline
|
||||
c.conn.NetConn().SetReadDeadline(time.Time{})
|
||||
|
||||
var videoBuf [][]byte
|
||||
var videoStartPTS time.Duration
|
||||
var videoDTSEst *h264.DTSEstimator
|
||||
videoFirstIDRFound := false
|
||||
@@ -300,7 +299,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
nalus, pts, err := h264Decoder.DecodeRTP(&pkt)
|
||||
nalus, pts, err := h264Decoder.DecodeUntilMarker(&pkt)
|
||||
if err != nil {
|
||||
if err != rtph264.ErrMorePacketsNeeded && err != rtph264.ErrNonStartingPacketAndNoPrevious {
|
||||
c.log(logger.Warn, "unable to decode video track: %v", err)
|
||||
@@ -308,6 +307,8 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
var nalusFiltered [][]byte
|
||||
|
||||
for _, nalu := range nalus {
|
||||
// remove SPS, PPS and AUD, not needed by RTMP
|
||||
typ := h264.NALUType(nalu[0] & 0x1F)
|
||||
@@ -316,12 +317,9 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
videoBuf = append(videoBuf, nalu)
|
||||
nalusFiltered = append(nalusFiltered, nalu)
|
||||
}
|
||||
|
||||
// RTP marker means that all the NALUs with the same PTS have been received.
|
||||
// send them together.
|
||||
if pkt.Marker {
|
||||
idrPresent := func() bool {
|
||||
for _, nalu := range nalus {
|
||||
typ := h264.NALUType(nalu[0] & 0x1F)
|
||||
@@ -335,7 +333,6 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
// wait until we receive an IDR
|
||||
if !videoFirstIDRFound {
|
||||
if !idrPresent {
|
||||
videoBuf = nil
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -344,7 +341,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
videoDTSEst = h264.NewDTSEstimator()
|
||||
}
|
||||
|
||||
data, err := h264.EncodeAVCC(videoBuf)
|
||||
data, err := h264.EncodeAVCC(nalusFiltered)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -363,9 +360,6 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
videoBuf = nil
|
||||
}
|
||||
|
||||
} else if audioTrack != nil && pair.trackID == audioTrackID {
|
||||
var pkt rtp.Packet
|
||||
err := pkt.Unmarshal(pair.buf)
|
||||
@@ -374,7 +368,7 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
aus, pts, err := aacDecoder.DecodeRTP(&pkt)
|
||||
aus, pts, err := aacDecoder.Decode(&pkt)
|
||||
if err != nil {
|
||||
if err != rtpaac.ErrMorePacketsNeeded {
|
||||
c.log(logger.Warn, "unable to decode audio track: %v", err)
|
||||
@@ -518,13 +512,22 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
|
||||
frames, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime)
|
||||
pkts, err := h264Encoder.Encode(outNALUs, pkt.Time+pkt.CTime)
|
||||
if err != nil {
|
||||
return fmt.Errorf("ERR while encoding H264: %v", err)
|
||||
}
|
||||
|
||||
for _, frame := range frames {
|
||||
onFrame(videoTrackID, frame)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding H264: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
onFrame(videoTrackID, byts)
|
||||
}
|
||||
|
||||
case av.AAC:
|
||||
@@ -532,13 +535,22 @@ func (c *rtmpConn) runPublish(ctx context.Context) error {
|
||||
return fmt.Errorf("ERR: received an AAC frame, but track is not set up")
|
||||
}
|
||||
|
||||
frames, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime)
|
||||
pkts, err := aacEncoder.Encode([][]byte{pkt.Data}, pkt.Time+pkt.CTime)
|
||||
if err != nil {
|
||||
return fmt.Errorf("ERR while encoding AAC: %v", err)
|
||||
}
|
||||
|
||||
for _, frame := range frames {
|
||||
onFrame(audioTrackID, frame)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding AAC: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
onFrame(audioTrackID, byts)
|
||||
}
|
||||
|
||||
default:
|
||||
|
@@ -206,8 +206,17 @@ func (s *rtmpSource) runInner() bool {
|
||||
return fmt.Errorf("ERR while encoding H264: %v", err)
|
||||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
onFrame(videoTrackID, pkt)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding H264: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
onFrame(videoTrackID, byts)
|
||||
}
|
||||
|
||||
case av.AAC:
|
||||
@@ -220,8 +229,17 @@ func (s *rtmpSource) runInner() bool {
|
||||
return fmt.Errorf("ERR while encoding AAC: %v", err)
|
||||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
onFrame(audioTrackID, pkt)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding AAC: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
onFrame(audioTrackID, byts)
|
||||
}
|
||||
|
||||
default:
|
||||
|
@@ -245,8 +245,17 @@ func (p *clientVideoProcessor) doProcess(
|
||||
return fmt.Errorf("error while encoding H264: %v", err)
|
||||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
p.onFrame(pkt)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding H264: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
p.onFrame(byts)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -369,8 +378,17 @@ func (p *clientAudioProcessor) doProcess(
|
||||
return fmt.Errorf("error while encoding AAC: %v", err)
|
||||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
p.onFrame(pkt)
|
||||
bytss := make([][]byte, len(pkts))
|
||||
for i, pkt := range pkts {
|
||||
byts, err := pkt.Marshal()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error while encoding AAC: %v", err)
|
||||
}
|
||||
bytss[i] = byts
|
||||
}
|
||||
|
||||
for _, byts := range bytss {
|
||||
p.onFrame(byts)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
Reference in New Issue
Block a user