import socket class MyRtspManager: def __init__(self): self.rtsp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pass def __del__(self): pass def _send_rtsp_request(self,request): ''' 发送 RTSP 请求:按照 RTSP 协议的格式发送请求,例如 OPTIONS、DESCRIBE、SETUP 和 PLAY 请求。 :param socket: :param request: :return: ''' self.rtsp_socket.sendall(request.encode()) response = self.rtsp_socket.recv(4096).decode() print("Response:\n", response) return response def _connectRest(self,IP,Port): #self.rtsp_socket.connect(('192.168.3.103', 554)) self.rtsp_socket.connect((IP, Port)) #需要补充重连机制 def startGetRtsp(self): # 发送 OPTIONS 请求 request = "OPTIONS rtsp://192.168.3.103/live1 RTSP/1.0\r\nCSeq: 1\r\n\r\n" self._send_rtsp_request(request) # 发送 DESCRIBE 请求获取 SDP 信息 request = "DESCRIBE rtsp://192.168.3.103/live1 RTSP/1.0\r\nCSeq: 2\r\nAccept: application/sdp\r\n\r\n" response = self._send_rtsp_request(request) # 解析 SDP 信息,提取媒体信息(如视频轨道的端口、编码) # 此处需解析返回的 response 来提取端口、编码等信息 # 发送 SETUP 请求来配置 RTP/RTCP 传输 request = "SETUP rtsp://192.168.3.103/live1/trackID=0 RTSP/1.0\r\nCSeq: 3\r\nTransport: RTP/AVP;unicast;client_port=5000-5001\r\n\r\n" self._send_rtsp_request(request) # 创建 UDP 套接字来接收 RTP 数据 rtp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) rtp_socket.bind(('0.0.0.0', 5000)) # 绑定到前面 SETUP 请求中指定的 client_port while True: rtp_packet, _ = rtp_socket.recvfrom(2048) # 解析 RTP 包的头部,提取负载数据(视频帧) # 可以根据负载类型解析 H264 或其他格式的帧数据 print(f"Received RTP packet of size {len(rtp_packet)}")