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 = Noneport = Nonefor 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)# 解析 SDPprotocol, 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的报文解析没有做

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测基础初步学习

目标检测(Object Detection) 目标检测任务说明 在动手学习深度学习中对目标检测任务有如下的描述。 图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们…

【C++软件调试技术】什么是pdb文件?如何使用pdb文件?哪些工具需要使用pdb文件?

目录 1、什么是pdb文件? 2、如何配置生成pdb文件? 3、pdb文件的时间戳和文件名称 3.1、pdb文件的时间戳 3.2、pdb文件的文件名称 4、有pdb文件才能在Visual Studio中调试代码 5、在Windbg中使用pdb文件 5.1、使用lm命令查看二进制文件的时间戳&a…

翻译《The Old New Thing》- Why do atoms start at 0xC000?

Why do atoms start at 0xC000? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080429-00/?p22543 Raymond Chen 2008年04月03日 有两种类型的原子,即所谓的整数原子,它们只是一些小整数,还有就是没有…

GE的六西格玛是怎么成功的?

六西格玛作为一种先进的质量管理方法,旨在通过消除缺陷、提高流程效率来降低成本、增强客户满意度。GE作为最早采用六西格玛的公司之一,其成功的原因首先离不开高层领导对精益六西格玛理念的坚定支持和推动。公司高层不仅亲自参与培训和项目实践&#xf…

何为云防护?有何作用

云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…

Python assertTrue用法:深入探索与实用技巧

Python assertTrue用法:深入探索与实用技巧 在Python的单元测试框架中,assertTrue是一个核心断言方法,用于验证某个条件是否为真。本文将深入探讨assertTrue的用法,并从四个方面、五个方面、六个方面和七个方面对其进行详细解析&…

一分钟了解香港的场外期权报价

香港的场外期权报价 在香港这个国际金融中心,场外期权交易是金融市场不可或缺的一部分。场外期权,作为一种非标准化的金融衍生品,为投资者提供了在特定时间以约定价格买入或卖出某种资产的机会。对于希望参与这一市场的投资者来说&#xff0…

电脑记事本怎么恢复之前的内容记录

每个人都曾有过这样的时刻——在记事本上精心记录下的重要内容,一不小心就被删除了。那种心情,仿佛一瞬间从山顶跌落到谷底,无尽的懊悔涌上心头。我也曾遭遇过这样的困境,那些消失的文字对我来说意义非凡,它们的丢失仿…

基于小波变换贝叶斯LMMSE估计的图像降噪方法(MATLAB 2018)

自从小波被发现以来,由于其优良的时频局部化性能,大大解决了信号与图像降噪的难题。利用小波降噪大致有三种方法,分别是基于小波模极大值原理、基于小波变换系数的相关性,和最为常用的小波阈值函数法。 基于小波模极大值降噪 该…

AI程序员来了,大批码农要失业

根据GitHub发布的《Octoverse 2021年度报告》,2021年中国有755万程序员,排名全球第二。 ChatGPT的出现,堪比在全球互联网行业点燃了一枚“核弹”,很多人都会担心“自己的工作会不会被AI取代”。 而2024年的AI进展速度如火箭般&am…

S4 BP 维护

前台输入Tcode:BP 问候填写金税开票信息使用的开户行名称,注释填写金税开票信息使用的开户行代码 屏幕下滑按需填写其他数据,如:街道2,街道3,街道/门牌号,街道4,街道5,区域,邮编、城市、国家、地区、语言,电话(发票地址里的电话(必须是客户开票资料里提供的电话,会…

【MyBatisPlus】MyBatisPlus条件查询

【MyBatisPlus】MyBatisPlus条件查询 文章目录 【MyBatisPlus】MyBatisPlus条件查询1、查询条件方式2、组合条件3、NULL值处理4、查询投影-设置【查询字段、分组】5、查询条件6、字段映射与表名映射问题导入 1、查询条件方式 MyBatisPlus将书写复杂的SQL查询条件进行了封装&…

JSON 数据格式化方法

文章目录 数据介绍IDE 或脚本格式化在线工具网址总结 数据介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript 编程语言的一个子集。尽管它起源于 JavaScript,但 JSON 已经成为了一个完全独立于…

保护隐私下的数据提取:方法与伦理考量

在数字化时代,数据的收集和分析为我们提供了前所未有的机会和便利。然而,这些机遇也伴随着隐私泄露的严重风险。如何在保护个人隐私的前提下进行数据提取,已成为一个亟待解决的问题。本文将探讨保护隐私下的数据提取方法,并深入分…

2024专精特新趋势论坛,汉王友基分享数字化创新实践之路

5月31日,由深圳市中小企业服务局作为指导单位,36氪主办的“WISE新风向2024专精特新趋势论坛”在粤港澳大湾区顺利举办。 汉王友基作为国家级专精特新“小巨人”企业代表,受邀参加此次大会,企业CTO邓立明先生进行了《数字赋能&…

让企业自己掌握数据主权,可道云teamOS让企业数据私有化不再是难题,让企业数据更安全、更可控

越来越多的企业开始意识到,仅仅依赖公共云存储服务可能无法满足其对于数据安全性的高标准要求。 毕竟每年都会有不同程度的数据泄露问题爆出,导致大家在使用企业网盘的时候也总是惴惴不安。一旦数据泄露或被非法获取,企业将面临巨大的经济损…

geotrust泛域名https600元

泛域名https证书,也可以称之为通配符https证书,是开发者用来保障网站安全、提升用户信任度的方案之一。开发者可以使用泛域名https证书为多个网站进行数据加密以及身份认证服务,提升网站的安全性。今天就随SSL盾小编了解geotrust旗下的泛域名…

如何理解 Java 线程的概念及线程的创建和管理,包括 Runnable 接口和 Thread 类

多线程编程是现代软件开发中的重要技术,能够显著提高程序的效率和响应速度。Java 提供了丰富的多线程编程支持,使开发者可以轻松地创建和管理线程。 1. 线程的基本概念 1.1 进程与线程 进程:是操作系统中独立运行的程序,每个进…

AI大模型页面

自己做的AI,模仿GPT。 访问地址:欢迎 请大家给点意见,需要追加哪些功能。

前端高速成长的八个阶段

高速成长阶段一:学会用 Google 英文搜索。 为什么不用百度? 因为搜索范围与质量相差太大。用谷歌,你通常能在第一页找到高质量的答案,而在百度你可能需要花费更多时间。英文搜索并不难,例如遇到 React 报错&#xff0…