diff --git a/main.go b/main.go index 0e36dace..b0da6abd 100644 --- a/main.go +++ b/main.go @@ -247,21 +247,21 @@ func newProgram(args []string, stdin io.Reader) (*program, error) { http.DefaultServeMux = http.NewServeMux() } - p.serverRtp, err = newServerUdp(p, conf.RtpPort, gortsplib.StreamTypeRtp) - if err != nil { - return nil, err - } - if _, ok := conf.protocolsParsed[gortsplib.StreamProtocolUdp]; ok { + p.serverRtp, err = newServerUdp(p, conf.RtpPort, gortsplib.StreamTypeRtp) + if err != nil { + return nil, err + } + p.serverRtcp, err = newServerUdp(p, conf.RtcpPort, gortsplib.StreamTypeRtcp) if err != nil { return nil, err } + } - p.serverRtsp, err = newServerTcp(p) - if err != nil { - return nil, err - } + p.serverRtsp, err = newServerTcp(p) + if err != nil { + return nil, err } for name, confp := range conf.Paths { @@ -284,12 +284,18 @@ func newProgram(args []string, stdin io.Reader) (*program, error) { if p.metrics != nil { go p.metrics.run() } - go p.serverRtp.run() - go p.serverRtcp.run() - go p.serverRtsp.run() + + if _, ok := conf.protocolsParsed[gortsplib.StreamProtocolUdp]; ok { + go p.serverRtp.run() + go p.serverRtcp.run() + } + for _, s := range p.sources { go s.run() } + + go p.serverRtsp.run() + go p.run() return p, nil @@ -541,13 +547,13 @@ outer: cmd.Wait() } + p.serverRtsp.close() + for _, s := range p.sources { s.events <- sourceEventTerminate{} <-s.done } - p.serverRtsp.close() - if _, ok := p.conf.protocolsParsed[gortsplib.StreamProtocolUdp]; ok { p.serverRtcp.close() p.serverRtp.close() diff --git a/main_test.go b/main_test.go index 1da4eeb4..cc2a2799 100644 --- a/main_test.go +++ b/main_test.go @@ -213,6 +213,41 @@ func TestRead(t *testing.T) { } } +func TestTcpOnly(t *testing.T) { + stdin := []byte("\n" + + "protocols: [tcp]\n") + p, err := newProgram([]string{"stdin"}, bytes.NewBuffer(stdin)) + require.NoError(t, err) + defer p.close() + + time.Sleep(1 * time.Second) + + cnt1, err := newContainer("ffmpeg", "publish", []string{ + "-re", + "-stream_loop", "-1", + "-i", "/emptyvideo.ts", + "-c", "copy", + "-f", "rtsp", + "-rtsp_transport", "tcp", + "rtsp://" + ownDockerIp + ":8554/teststream", + }) + require.NoError(t, err) + defer cnt1.close() + + cnt2, err := newContainer("ffmpeg", "read", []string{ + "-rtsp_transport", "tcp", + "-i", "rtsp://" + ownDockerIp + ":8554/teststream", + "-vframes", "1", + "-f", "image2", + "-y", "/dev/null", + }) + require.NoError(t, err) + defer cnt2.close() + + code := cnt2.wait() + require.Equal(t, 0, code) +} + func TestAuth(t *testing.T) { t.Run("publish", func(t *testing.T) { stdin := []byte("\n" +