mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-11-03 09:51:26 +08:00
RTSP client/source: support dynamic H264 SPS/PPS
This commit is contained in:
@@ -216,7 +216,7 @@ func TestRTSPSourceNoPassword(t *testing.T) {
|
||||
<-done
|
||||
}
|
||||
|
||||
func TestRTSPSourceMissingH264Params(t *testing.T) {
|
||||
func TestRTSPSourceDynamicH264Params(t *testing.T) {
|
||||
track, err := gortsplib.NewTrackH264(96, nil, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -235,35 +235,6 @@ func TestRTSPSourceMissingH264Params(t *testing.T) {
|
||||
}, stream, nil
|
||||
},
|
||||
onPlay: func(ctx *gortsplib.ServerHandlerOnPlayCtx) (*base.Response, error) {
|
||||
go func() {
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
|
||||
enc := &rtph264.Encoder{PayloadType: 96}
|
||||
enc.Init()
|
||||
|
||||
pkts, err := enc.Encode([][]byte{{5}}, 0) // IDR
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{7, 1, 2, 3}}, 0) // SPS
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{8}}, 0) // PPS
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{5, 1}}, 0) // IDR
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{5, 2}}, 0) // IDR
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
}()
|
||||
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -280,32 +251,66 @@ func TestRTSPSourceMissingH264Params(t *testing.T) {
|
||||
"hlsDisable: yes\n" +
|
||||
"paths:\n" +
|
||||
" proxied:\n" +
|
||||
" source: rtsp://127.0.0.1:8555/teststream\n" +
|
||||
" sourceOnDemand: yes\n")
|
||||
" source: rtsp://127.0.0.1:8555/teststream\n")
|
||||
require.Equal(t, true, ok)
|
||||
defer p.close()
|
||||
|
||||
received := make(chan struct{})
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
c := gortsplib.Client{
|
||||
OnPacketRTP: func(ctx *gortsplib.ClientOnPacketRTPCtx) {
|
||||
if ctx.H264NALUs == nil {
|
||||
return
|
||||
}
|
||||
enc := &rtph264.Encoder{PayloadType: 96}
|
||||
enc.Init()
|
||||
|
||||
require.Equal(t, [][]byte{{0x05, 0x02}}, ctx.H264NALUs)
|
||||
close(received)
|
||||
},
|
||||
}
|
||||
|
||||
err = c.StartReading("rtsp://127.0.0.1:8554/proxied")
|
||||
pkts, err := enc.Encode([][]byte{{7, 1, 2, 3}}, 0) // SPS
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
h264Track, ok := c.Tracks()[0].(*gortsplib.TrackH264)
|
||||
require.Equal(t, true, ok)
|
||||
require.Equal(t, []byte{7, 1, 2, 3}, h264Track.SPS())
|
||||
require.Equal(t, []byte{8}, h264Track.PPS())
|
||||
pkts, err = enc.Encode([][]byte{{8}}, 0) // PPS
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
<-received
|
||||
func() {
|
||||
c := gortsplib.Client{}
|
||||
|
||||
u, err := base.ParseURL("rtsp://127.0.0.1:8554/proxied")
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.Start(u.Scheme, u.Host)
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
tracks, _, _, err := c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
h264Track, ok := tracks[0].(*gortsplib.TrackH264)
|
||||
require.Equal(t, true, ok)
|
||||
require.Equal(t, []byte{7, 1, 2, 3}, h264Track.SPS())
|
||||
require.Equal(t, []byte{8}, h264Track.PPS())
|
||||
}()
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{7, 4, 5, 6}}, 0) // SPS
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
pkts, err = enc.Encode([][]byte{{8, 1}}, 0) // PPS
|
||||
require.NoError(t, err)
|
||||
stream.WritePacketRTP(0, pkts[0], true)
|
||||
|
||||
func() {
|
||||
c := gortsplib.Client{}
|
||||
|
||||
u, err := base.ParseURL("rtsp://127.0.0.1:8554/proxied")
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.Start(u.Scheme, u.Host)
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
tracks, _, _, err := c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
h264Track, ok := tracks[0].(*gortsplib.TrackH264)
|
||||
require.Equal(t, true, ok)
|
||||
require.Equal(t, []byte{7, 4, 5, 6}, h264Track.SPS())
|
||||
require.Equal(t, []byte{8, 1}, h264Track.PPS())
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user