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