You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

52 lines
2.1 KiB

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)}")