解析 RTP 包时,将 RTP 的扩展部分解析出来
This commit is contained in:
		
							
								
								
									
										4
									
								
								av/av.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								av/av.go
									
									
									
									
									
								
							| @@ -191,7 +191,7 @@ const avCodecTypeMagic = 233333 | |||||||
| // CodecData is some important bytes for initializing audio/video decoder, | // CodecData is some important bytes for initializing audio/video decoder, | ||||||
| // can be converted to VideoCodecData or AudioCodecData using: | // can be converted to VideoCodecData or AudioCodecData using: | ||||||
| // | // | ||||||
| //     codecdata.(AudioCodecData) or codecdata.(VideoCodecData) | //	codecdata.(AudioCodecData) or codecdata.(VideoCodecData) | ||||||
| // | // | ||||||
| // for H264, CodecData is AVCDecoderConfigure bytes, includes SPS/PPS. | // for H264, CodecData is AVCDecoderConfigure bytes, includes SPS/PPS. | ||||||
| type CodecData interface { | type CodecData interface { | ||||||
| @@ -255,6 +255,8 @@ type Packet struct { | |||||||
| 	Time            time.Duration // packet decode time | 	Time            time.Duration // packet decode time | ||||||
| 	Duration        time.Duration //packet duration | 	Duration        time.Duration //packet duration | ||||||
| 	Data            []byte        // packet data | 	Data            []byte        // packet data | ||||||
|  | 	Extension       bool | ||||||
|  | 	Extensions      []byte | ||||||
| } | } | ||||||
|  |  | ||||||
| // Raw audio frame. | // Raw audio frame. | ||||||
|   | |||||||
| @@ -35,6 +35,8 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { | |||||||
| 	if client.end-client.offset >= 4*CSRCCnt { | 	if client.end-client.offset >= 4*CSRCCnt { | ||||||
| 		client.offset += 4 * CSRCCnt | 		client.offset += 4 * CSRCCnt | ||||||
| 	} | 	} | ||||||
|  | 	extensionStart := 0 | ||||||
|  | 	extensionEnd := 0 | ||||||
| 	if extension && len(content) < 4+client.offset+2+2 { | 	if extension && len(content) < 4+client.offset+2+2 { | ||||||
| 		return nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
| @@ -42,6 +44,8 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { | |||||||
| 		extLen := 4 * int(binary.BigEndian.Uint16(content[4+client.offset+2:])) | 		extLen := 4 * int(binary.BigEndian.Uint16(content[4+client.offset+2:])) | ||||||
| 		client.offset += 4 | 		client.offset += 4 | ||||||
| 		if client.end-client.offset >= extLen { | 		if client.end-client.offset >= extLen { | ||||||
|  | 			extensionStart = client.offset | ||||||
|  | 			extensionEnd = client.offset + extLen | ||||||
| 			client.offset += extLen | 			client.offset += extLen | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -58,9 +62,19 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { | |||||||
|  |  | ||||||
| 	switch int(content[1]) { | 	switch int(content[1]) { | ||||||
| 	case client.videoID: | 	case client.videoID: | ||||||
| 		return client.handleVideo(content) | 		pck, ok := client.handleVideo(content) | ||||||
|  | 		for _, p := range pck { | ||||||
|  | 			p.Extension = extension | ||||||
|  | 			p.Extensions = content[extensionStart+4 : extensionEnd+4] | ||||||
|  | 		} | ||||||
|  | 		return pck, ok | ||||||
| 	case client.audioID: | 	case client.audioID: | ||||||
| 		return client.handleAudio(content) | 		pck, ok := client.handleAudio(content) | ||||||
|  | 		for _, p := range pck { | ||||||
|  | 			p.Extension = extension | ||||||
|  | 			p.Extensions = content[extensionStart+4 : extensionEnd+4] | ||||||
|  | 		} | ||||||
|  | 		return pck, ok | ||||||
| 	} | 	} | ||||||
| 	return nil, false | 	return nil, false | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 kunmeng
					kunmeng