From 250576b3403a546720b11dd15c72756572fecabb Mon Sep 17 00:00:00 2001 From: Lidashuang Date: Mon, 18 Mar 2024 12:31:19 +0800 Subject: [PATCH] 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,