1. rtsp rtp rtcp
https://hope-wisdom.blog.csdn.net/article/details/138259027
2.rtsp加速
https://mp.weixin.qq.com/s/0C1b-8pFw0HaE1xpNbrxxw
3. 实现了一部分获取数据
import socket
import base64
import threading
import struct
# 定义 RTSP 请求
def send_rtsp_request(rtsp_method, rtsp_url, cseq, auth=None, transport=None):
request = f"{rtsp_method} {rtsp_url} RTSP/1.0\r\n"
request += f"CSeq: {cseq}\r\n"
if transport:
request += f"Transport: {transport}\r\n"
if auth:
request += f"Authorization: Basic {auth}\r\n"
request += "User-Agent: Vision MC\r\n"
request += "\r\n"
return request
# 解析 SDP 信息
def parse_sdp(sdp):
sdp_lines = sdp.split('\r\n')
protocol = None
port = None
for line in sdp_lines:
if line.startswith('m=video'):
parts = line.split(' ')
port = int(parts[1])
protocol = parts[2]
break # 找到第一个媒体描述后就可以停止了
return protocol, port
# 接收 RTP 数据
def recv_rtp_data(sock):
while True:
try:
rtp_data, _ = sock.recvfrom(4096)
print(rtp_data)
# # 解析 RTP 数据包
# version = (rtp_data[0] & 0xC0) >> 6
# padding = (rtp_data[0] & 0x20) >> 5
# extension = (rtp_data[0] & 0x10) >> 4
# csrc_count = rtp_data[0] & 0x0F
# marker = (rtp_data[1] & 0x80) >> 7
# payload_type = rtp_data[1] & 0x7F
# sequence_number = struct.unpack('!H', rtp_data[2:4])[0]
# timestamp = struct.unpack('!I', rtp_data[4:8])[0]
# ssrc = struct.unpack('!I', rtp_data[8:12])[0]
# payload = rtp_data[12:]
#
# # 处理 RTP 数据包的有效负载
# print(payload)
except Exception as e:
print(f"Error receiving RTP data: {e}")
break
# 定义 RTSP 服务器地址和端口
server_address = ('192.168.1.64', 554)
# RTSP URL
rtsp_url = "rtsp://192.168.1.64:554/Streaming/Channels/1"
rtsp_url1 = "rtsp://192.168.1.64:554/Streaming/Channels/1/trackID=1"
# 用户名和密码
username = "admin"
password = "av3926867"
# 将用户名和密码编码为 Base64 字符串
auth_str = base64.b64encode(f"{username}:{password}".encode()).decode()
# 创建 TCP 连接
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
client_socket.connect(server_address)
# 发送 DESCRIBE 请求
rtsp_request = send_rtsp_request("DESCRIBE", rtsp_url, 1, auth_str)
client_socket.sendall(rtsp_request.encode())
# 接收并打印 RTSP 响应
rtsp_response = client_socket.recv(4096).decode()
print(rtsp_response)
# 解析 SDP
protocol, port = parse_sdp(rtsp_response)
# 设置 RTP 数据接收套接字
rtp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
rtp_socket.settimeout(15)
rtp_socket.bind(('0.0.0.0', 0)) # 动态分配本地端口
local_rtp_port = rtp_socket.getsockname()[1]
# 发送 SETUP 请求
transport = f"RTP/AVP/TCP;unicast;interleaved=0-1"
rtsp_request = send_rtsp_request("SETUP", rtsp_url1, 2, auth_str, transport)
client_socket.sendall(rtsp_request.encode())
rtsp_response = client_socket.recv(4096).decode()
print(rtsp_response)
# 启动接收 RTP 数据的线程
rtp_thread = threading.Thread(target=recv_rtp_data, args=(rtp_socket,))
rtp_thread.start()
# 发送 PLAY 请求
rtsp_request = send_rtsp_request("PLAY", rtsp_url, 3, auth_str)
client_socket.sendall(rtsp_request.encode())
# 接收并解析 RTSP 响应
rtsp_response = client_socket.recv(4096).decode()
print(rtsp_response)
# 等待 RTP 数据接收线程结束
rtp_thread.join()
其中关于rtp的报文解析没有做