From 64bb2d145a8141841ac2c8c74b631f1336888f20 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Sat, 9 Mar 2024 15:51:13 +0800 Subject: [PATCH 1/7] add pause play --- format/rtspv2/client.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index c020122..d812eb6 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -46,6 +46,7 @@ const ( DESCRIBE = "DESCRIBE" OPTIONS = "OPTIONS" PLAY = "PLAY" + PAUSE = "PAUSE" SETUP = "SETUP" TEARDOWN = "TEARDOWN" ) @@ -271,7 +272,7 @@ func (client *RTSPClient) startStream() { client.Println("RTSP Client RTP SetDeadline", err) return } - if int(time.Now().Sub(timer).Seconds()) > 25 { + if int(time.Since(timer).Seconds()) > 25 { err := client.request(OPTIONS, map[string]string{"Require": "implicit-play"}, client.control, false, true) if err != nil { client.Println("RTSP Client RTP keep-alive", err) @@ -335,7 +336,7 @@ func (client *RTSPClient) startStream() { return } responseTmp = append(responseTmp, oneb...) - if (len(responseTmp) > 4 && bytes.Compare(responseTmp[len(responseTmp)-4:], []byte("\r\n\r\n")) == 0) || len(responseTmp) > 768 { + if (len(responseTmp) > 4 && bytes.Equal(responseTmp[len(responseTmp)-4:], []byte("\r\n\r\n"))) || len(responseTmp) > 768 { if strings.Contains(string(responseTmp), "Content-Length:") { si, err := strconv.Atoi(stringInBetween(string(responseTmp), "Content-Length: ", "\r\n")) if err != nil { @@ -371,15 +372,13 @@ func (client *RTSPClient) request(method string, customHeaders map[string]string if client.clientDigest { builder.WriteString(fmt.Sprintf("Authorization: %s\r\n", client.createDigest(method, uri))) } - if customHeaders != nil { - for k, v := range customHeaders { - builder.WriteString(fmt.Sprintf("%s: %s\r\n", k, v)) - } + for k, v := range customHeaders { + builder.WriteString(fmt.Sprintf("%s: %s\r\n", k, v)) } for k, v := range client.headers { builder.WriteString(fmt.Sprintf("%s: %s\r\n", k, v)) } - builder.WriteString(fmt.Sprintf("\r\n")) + builder.WriteString("\r\n") client.Println(builder.String()) s := builder.String() _, err = client.connRW.WriteString(s) @@ -505,6 +504,14 @@ func (client *RTSPClient) request(method string, customHeaders map[string]string return } +func (client *RTSPClient) Pause() error { + return client.request(PAUSE, nil, client.pURL.String(), false, true) +} + +func (client *RTSPClient) Play(customHeaders map[string]string) error { + return client.request(PLAY, customHeaders, client.pURL.String(), false, true) +} + func (client *RTSPClient) Close() { if client.conn != nil { client.conn.SetDeadline(time.Now().Add(time.Second)) @@ -561,7 +568,7 @@ func (client *RTSPClient) CodecUpdateSPS(val []byte) { if client.videoCodec != av.H264 && client.videoCodec != av.H265 { return } - if bytes.Compare(val, client.sps) == 0 { + if bytes.Equal(val, client.sps) { return } client.sps = val @@ -601,7 +608,7 @@ func (client *RTSPClient) CodecUpdatePPS(val []byte) { if client.videoCodec != av.H264 && client.videoCodec != av.H265 { return } - if bytes.Compare(val, client.pps) == 0 { + if bytes.Equal(val, client.pps) { return } client.pps = val @@ -641,7 +648,7 @@ func (client *RTSPClient) CodecUpdateVPS(val []byte) { if client.videoCodec != av.H265 { return } - if bytes.Compare(val, client.vps) == 0 { + if bytes.Equal(val, client.vps) { return } client.vps = val From 42c53daeab59b084a93c06f0dc446a21c49e9057 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Thu, 14 Mar 2024 17:56:17 +0800 Subject: [PATCH 2/7] add client status --- format/rtspv2/client.go | 7 +++++++ format/rtspv2/demuxer.go | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index d812eb6..2bd59c7 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -97,6 +97,7 @@ type RTSPClient struct { sequenceNumber int end int offset int + status string } type RTSPClientOptions struct { @@ -280,6 +281,10 @@ func (client *RTSPClient) startStream() { } timer = time.Now() } + if client.status == PAUSE { + // client.Println("RTSP Client PAUSE") + continue + } if !fixed { nb, err := io.ReadFull(client.connRW, header) if err != nil || nb != 4 { @@ -505,10 +510,12 @@ func (client *RTSPClient) request(method string, customHeaders map[string]string } func (client *RTSPClient) Pause() error { + client.status = PAUSE return client.request(PAUSE, nil, client.pURL.String(), false, true) } func (client *RTSPClient) Play(customHeaders map[string]string) error { + client.status = PLAY return client.request(PLAY, customHeaders, client.pURL.String(), false, true) } diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index 396ca41..01433dd 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -2,12 +2,13 @@ package rtspv2 import ( "encoding/binary" + "math" + "time" + "github.com/deepch/vdk/av" "github.com/deepch/vdk/codec/aacparser" "github.com/deepch/vdk/codec/h264parser" "github.com/deepch/vdk/codec/h265parser" - "math" - "time" ) const ( From 064ca7bcf9d5f4301fb504b2150647961e9e0d30 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Thu, 14 Mar 2024 19:23:10 +0800 Subject: [PATCH 3/7] add client status --- format/rtspv2/client.go | 8 ++++++-- format/rtspv2/demuxer.go | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index 2bd59c7..b622ad9 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -510,13 +510,17 @@ func (client *RTSPClient) request(method string, customHeaders map[string]string } func (client *RTSPClient) Pause() error { + if err := client.request(PAUSE, nil, client.pURL.String(), false, true); err != nil { + return err + } client.status = PAUSE - return client.request(PAUSE, nil, client.pURL.String(), false, true) } func (client *RTSPClient) Play(customHeaders map[string]string) error { + if err := client.request(PLAY, customHeaders, client.pURL.String(), false, true); err != nil { + return err + } client.status = PLAY - return client.request(PLAY, customHeaders, client.pURL.String(), false, true) } func (client *RTSPClient) Close() { diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index 01433dd..1fb28ce 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -78,9 +78,9 @@ func (client *RTSPClient) handleVideo(content []byte) ([]*av.Packet, bool) { client.PreVideoTS = 0 } } - if client.PreSequenceNumber != 0 && client.sequenceNumber-client.PreSequenceNumber != 1 { - client.Println("drop packet", client.sequenceNumber-1) - } + // if client.PreSequenceNumber != 0 && client.sequenceNumber-client.PreSequenceNumber != 1 { + // client.Println("drop packet", client.sequenceNumber-1) + // } client.PreSequenceNumber = client.sequenceNumber if client.BufferRtpPacket.Len() > 4048576 { client.Println("Big Buffer Flush") From 250576b3403a546720b11dd15c72756572fecabb Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Mon, 18 Mar 2024 12:31:19 +0800 Subject: [PATCH 4/7] add client status --- format/rtspv2/client.go | 11 +++++++++++ format/rtspv2/demuxer.go | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index b622ad9..87246aa 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -514,6 +514,7 @@ func (client *RTSPClient) Pause() error { return err } client.status = PAUSE + return nil } func (client *RTSPClient) Play(customHeaders map[string]string) error { @@ -521,6 +522,16 @@ func (client *RTSPClient) Play(customHeaders map[string]string) error { return err } client.status = PLAY + return nil +} + +func (client *RTSPClient) Seek(customHeaders map[string]string, target int64) error { + customHeaders["Range"] = fmt.Sprintf("npt=%d.00-", target) + if err := client.request(PLAY, customHeaders, client.pURL.String(), false, true); err != nil { + return err + } + client.status = PLAY + return nil } func (client *RTSPClient) Close() { diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index 1fb28ce..be4e7b2 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -2,6 +2,7 @@ package rtspv2 import ( "encoding/binary" + "fmt" "math" "time" @@ -16,22 +17,40 @@ const ( TimeDelay = 1 ) +func (client *RTSPClient) containsPayloadType(pt int) bool { + var exist bool + for _, sdp := range client.mediaSDP { + if sdp.Rtpmap == pt { + exist = true + } + } + return exist +} + func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { content := *payloadRAW firstByte := content[4] padding := (firstByte>>5)&1 == 1 extension := (firstByte>>4)&1 == 1 CSRCCnt := int(firstByte & 0x0f) - client.sequenceNumber = int(binary.BigEndian.Uint16(content[6:8])) - client.timestamp = int64(binary.BigEndian.Uint32(content[8:16])) - + payloadType := int(content[5] & 0x7f) + sequenceNumber := int(binary.BigEndian.Uint16(content[6:8])) + timestamp := int64(binary.BigEndian.Uint32(content[8:12])) if isRTCPPacket(content) { client.Println("skipping RTCP packet") return nil, false } - client.offset = RTPHeaderSize + if !client.containsPayloadType(payloadType) { + client.Println("skipping RTP packet") + return nil, false + } + client.Println(fmt.Sprintf("padding: %v, extension: %v, csrccnt: %d, sequence number: %d.payload type: %d, timestamp: %d", + padding, extension, CSRCCnt, sequenceNumber, payloadType, timestamp)) + client.offset = RTPHeaderSize + client.sequenceNumber = sequenceNumber + client.timestamp = timestamp client.end = len(content) if client.end-client.offset >= 4*CSRCCnt { client.offset += 4 * CSRCCnt @@ -78,9 +97,9 @@ func (client *RTSPClient) handleVideo(content []byte) ([]*av.Packet, bool) { client.PreVideoTS = 0 } } - // if client.PreSequenceNumber != 0 && client.sequenceNumber-client.PreSequenceNumber != 1 { - // client.Println("drop packet", client.sequenceNumber-1) - // } + if client.PreSequenceNumber != 0 && client.sequenceNumber-client.PreSequenceNumber != 1 { + client.Println("drop packet", client.sequenceNumber-1) + } client.PreSequenceNumber = client.sequenceNumber if client.BufferRtpPacket.Len() > 4048576 { client.Println("Big Buffer Flush") @@ -89,6 +108,7 @@ func (client *RTSPClient) handleVideo(content []byte) ([]*av.Packet, bool) { } nalRaw, _ := h264parser.SplitNALUs(content[client.offset:client.end]) if len(nalRaw) == 0 || len(nalRaw[0]) == 0 { + client.Println("nal Raw 0", nalRaw) return nil, false } var retmap []*av.Packet @@ -266,6 +286,9 @@ func (client *RTSPClient) appendAudioPacket(retmap []*av.Packet, nal []byte, dur } func (client *RTSPClient) appendVideoPacket(retmap []*av.Packet, nal []byte, isKeyFrame bool) []*av.Packet { + if client.timestamp-client.PreVideoTS == 0 { + client.Println("Duration is 0", client.timestamp, client.PreVideoTS) + } return append(retmap, &av.Packet{ Data: append(binSize(len(nal)), nal...), CompositionTime: time.Duration(TimeDelay) * time.Millisecond, From d064ade9a667b078e03b541a736f937fb5ff7448 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Mon, 18 Mar 2024 12:41:39 +0800 Subject: [PATCH 5/7] add client status --- format/rtspv2/demuxer.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index be4e7b2..d94c1c7 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -2,7 +2,6 @@ package rtspv2 import ( "encoding/binary" - "fmt" "math" "time" @@ -42,12 +41,12 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { } if !client.containsPayloadType(payloadType) { - client.Println("skipping RTP packet") + client.Println("skipping RTP packet, paytload type: %d ", payloadType) return nil, false } - client.Println(fmt.Sprintf("padding: %v, extension: %v, csrccnt: %d, sequence number: %d.payload type: %d, timestamp: %d", - padding, extension, CSRCCnt, sequenceNumber, payloadType, timestamp)) + // client.Println(fmt.Sprintf("padding: %v, extension: %v, csrccnt: %d, sequence number: %d.payload type: %d, timestamp: %d", + // padding, extension, CSRCCnt, sequenceNumber, payloadType, timestamp)) client.offset = RTPHeaderSize client.sequenceNumber = sequenceNumber client.timestamp = timestamp From 809c2f3c7267b8700b0788e85e1dcb6df4cbcfb8 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Mon, 18 Mar 2024 12:48:04 +0800 Subject: [PATCH 6/7] add client status --- format/rtspv2/demuxer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index d94c1c7..4579d73 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -2,6 +2,7 @@ package rtspv2 import ( "encoding/binary" + "fmt" "math" "time" @@ -41,7 +42,7 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { } if !client.containsPayloadType(payloadType) { - client.Println("skipping RTP packet, paytload type: %d ", payloadType) + client.Println(fmt.Sprintf("skipping RTP packet, paytload type: %v", payloadType)) return nil, false } From d9df5d5c341eeee29f8c510f20869e799add5200 Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Mon, 18 Mar 2024 12:49:56 +0800 Subject: [PATCH 7/7] add client status --- format/rtspv2/demuxer.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/format/rtspv2/demuxer.go b/format/rtspv2/demuxer.go index 4579d73..ac61184 100644 --- a/format/rtspv2/demuxer.go +++ b/format/rtspv2/demuxer.go @@ -286,9 +286,6 @@ func (client *RTSPClient) appendAudioPacket(retmap []*av.Packet, nal []byte, dur } func (client *RTSPClient) appendVideoPacket(retmap []*av.Packet, nal []byte, isKeyFrame bool) []*av.Packet { - if client.timestamp-client.PreVideoTS == 0 { - client.Println("Duration is 0", client.timestamp, client.PreVideoTS) - } return append(retmap, &av.Packet{ Data: append(binSize(len(nal)), nal...), CompositionTime: time.Duration(TimeDelay) * time.Millisecond,