rtsp python实现

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的报文解析没有做

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值