当前位置: 首页 > news >正文

rtsp 协议推流接收(tcp udp)

使用两种方式进行推流,udp 和tcp,必须先理解udp 和tcp推流方式的不同

udp 推流

./ffmpeg -re -i d:/test.mp4 -c copy -av -f rtsp rtsp://192.168.0.24/live/1

OPTIONS rtsp://192.168.0.24:554/live/1 RTSP/1.0
CSeq: 1
User-Agent: Lavf60.16.100RTSP/1.0 200 OK
CSeq: 1
Date: Sat, Sep 28 2024 01:33:39 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, ANNOUNCE, RECORD, SET_PARAMETER, GET_PARAMETER
Server: ViewPointserverANNOUNCE rtsp://192.168.0.24:554/live/1 RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: Lavf60.16.100
Content-Length: 2xxv=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.0.24
t=0 0
a=tool:CRYPT 
m=video 0 RTP/AVP 96
b=AS:13152
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z01AKZWQB4AiflwEQAAA+gAAMNQh,aOuPIA==; profile-level-id=4D4029
a=control:streamid=0
RTSP/1.0 200 OK
CSeq: 2
Date: Sat, Sep 28 2024 01:33:39 GMT
Server: ViewPointserver
Session: NOzALlDctEdMSETUP rtsp://192.168.0.24:554/live/1/streamid=0 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=28590-28591;mode=record
CSeq: 3
User-Agent: Lavf60.16.100
Session: NOzALlDctEdMRTSP/1.0 200 OK
CSeq: 3
Date: Sat, Sep 28 2024 01:33:39 GMT
Server: ViewPointServer
Session: NOzALlDctEdM
Transport: RTP/AVP/UDP;unicast;client_port=28590-28591;mode=record;server_port=31006-31007;ssrc=00000000RECORD rtsp://192.168.0.24:554/live/1 RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent: Lavf60.16.100
Session: NOzALlDctEdMRTSP/1.0 200 OK
CSeq: 4
Date: Sat, Sep 28 2024 01:33:39 GMT
RTP-Info: url=rtsp://192.168.0.24:554/live/1/streamid=0
Server: ViewPointServer,build time:2024-04-11T13:25:49)
Session: NOzALlDctEdM

RTSP 交互日志的分析:

一、OPTIONS 请求与响应

首先,客户端向服务器 rtsp://192.168.0.24:554/live/1 发送了一个 OPTIONS 请求。这个请求通常用于获取服务器支持的方法列表。
请求中包含了一些信息:
CSeq: 1 表示这个请求的序列号为 1。
User-Agent: Lavf60.16.100 表明了发出请求的客户端软件信息。
服务器响应:
RTSP/1.0 200 OK 表示请求成功。
CSeq: 1 与请求中的序列号对应。
Date: Sat, Sep 28 2024 01:33:39 GMT 给出了响应的时间。
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, ANNOUNCE, RECORD, SET_PARAMETER, GET_PARAMETER 告知客户端服务器支持的方法列表。
Server: 显示了服务器的软件信息。

二、ANNOUNCE 请求与响应

客户端发送 ANNOUNCE 请求,通常用于向服务器提供媒体描述信息。注意sdp本身也是一个协议
请求包含:
Content-Type: application/sdp 表明请求体中的内容类型为 SDP(Session Description Protocol)。
CSeq: 2 序列号为 2。
User-Agent: Lavf60.16.100 客户端软件信息。
Content-Length: 299 表示请求体的长度为 299 字节。
请求体中是 SDP 描述信息,包括版本号、源信息、媒体信息等。
服务器响应:
RTSP/1.0 200 OK 请求成功。
CSeq: 2 对应请求的序列号。
Date: Sat, Sep 28 2024 01:33:39 GMT 响应时间。
Server:ViewPointServer 服务器软件信息。
Session: NOzALlDctEdM 分配给这个会话的唯一标识符。

三、SETUP 请求与响应

客户端发送 SETUP 请求,用于建立媒体传输连接。
请求包含:
Transport: RTP/AVP/UDP;unicast;client_port=28590-28591;mode=record 指定了传输协议、传输方式、客户端端口和模式。
CSeq: 3 序列号为 3。
User-Agent: Lavf60.16.100 客户端软件信息。
Session: NOzALlDctEdM 使用之前分配的会话标识符。
服务器响应:
RTSP/1.0 200 OK 请求成功。
CSeq: 3 对应请求的序列号。
Date: Sat, Sep 28 2024 01:33:39 GMT 响应时间。
Server: 服务器软件信息。
Session: NOzALlDctEdM 会话标识符。
Transport: RTP/AVP/UDP;unicast;client_port=28590-28591;mode=record;server_port=31006-31007;ssrc=00000000 服务器返回的传输信息,包括服务器端口和同步源标识符。

四、RECORD 请求与响应

客户端发送 RECORD 请求,开始录制媒体流。
请求包含:
Range: npt=0.000- 可能指定了录制的时间范围。
CSeq: 4 序列号为 4。
User-Agent: Lavf60.16.100 客户端软件信息。
Session: NOzALlDctEdM 会话标识符。
服务器响应:
RTSP/1.0 200 OK 请求成功。
CSeq: 4 对应请求的序列号。
Date: Sat, Sep 28 2024 01:33:39 GMT 响应时间。
RTP-Info: url=rtsp://192.168.0.24:554/live/1/streamid=0 提供了 RTP 流的信息。
Server: ViewPointServer 观点服务器软件信息。
Session: NOzALlDctEdM 会话标识符。
总体来说,交互展示了客户端使用 RTSP 协议与服务器进行交互的过程,包括获取服务器支持的方法、提供媒体描述、建立传输连接和开始录制媒体流等步骤。

tcp rtsp 推流

使用ffmpeg 进行推流,关键字如下
-rtsp_transport tcp

注意rtsp_transport 的位置,不要放在开头,要在v 和 a 的后面, rtsp协议的前面
./ffmpeg -re -i d:/test.mp4 -c:v copy -c:a copy -rtsp_transport tcp -f rtsp rtsp://192.168.0.24/live/1

包如下

OPTIONS rtsp://192.168.0.24:8554/live/1 RTSP/1.0
CSeq: 1
User-Agent: Lavf60.16.100RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, ANNOUNCE, SETUP, PLAY, RECORD, PAUSE, GET_PARAMETER, TEARDOWN
Server: gortsplibANNOUNCE rtsp://192.168.0.24:8554/live/1 RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: Lavf60.16.100
Content-Length: 372v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.0.24
t=0 0
a=tool:libavformat 60.16.100
m=video 0 RTP/AVP 96
a=rtpmap:96 H265/90000
a=fmtp:96 sprop-vps=QAEMAf//AUAAAAMAgAAAAwAAAwC0rAk=; sprop-sps=QgEBAUAAAAMAgAAAAwAAAwC0oAKAgC0WWuSytmuXE0BAAAADAEAAAAUP4sSg; sprop-pps=RAHA4w8DMkAA
a=control:streamid=0
m=audio 0 RTP/AVP 0
b=AS:64
a=control:streamid=1
RTSP/1.0 200 OK
CSeq: 2
Server: gortsplibSETUP rtsp://192.168.0.24:8554/live/1/streamid=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record
CSeq: 3
User-Agent: Lavf60.16.100RTSP/1.0 200 OK
CSeq: 3
Server: gortsplib
Session: 541f23a1bc914e78bc405253a7f8c037
Transport: RTP/AVP/TCP;unicast;interleaved=0-1SETUP rtsp://192.168.0.24:8554/live/1/streamid=1 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=2-3;mode=record
CSeq: 4
User-Agent: Lavf60.16.100
Session: 541f23a1bc914e78bc405253a7f8c037RTSP/1.0 200 OK
CSeq: 4
Server: gortsplib
Session: 541f23a1bc914e78bc405253a7f8c037
Transport: RTP/AVP/TCP;unicast;interleaved=2-3RECORD rtsp://192.168.0.24:8554/live/1 RTSP/1.0
Range: npt=0.000-
CSeq: 5
User-Agent: Lavf60.16.100
Session: 541f23a1bc914e78bc405253a7f8c037RTSP/1.0 200 OK
CSeq: 5
Server: gortsplib
Session: 541f23a1bc914e78bc405253a7f8c037

接下来后面就是rtp的包直接跟在后面
tcp的rtp协议和udp 的rtp 有所不同,每个rtp包前面会多出四个字节

static void set_buf_rtp_over_rtsp_tag(uint8_t* pbuffer, uint8_t bychannel, uint16_t dwlen)
{
pbuffer[0] = 0x24;//$ magic char
pbuffer[1] = bychannel;
pbuffer[2] = (dwlen >> 8) & 0xff;
pbuffer[3] = dwlen & 0xff;
}
一个是0x24 ,一个是chhannel
后面两个字节是包长,根据这个再去接收包

其他

如果sdp协议里没有sps,pps,h265 包含vps,sps,pps则要在关键帧前面加这些信息,sdp协议里面是base64编码的sps,pps等信息

ViewPointServer 实现

1 接收3588 rtsp tcp 推流,为什么要用tcp,防止要推送到外网,server如果在外网,内网使用udp是无法推送的
2 ViewPointServer 接收流后解码进行超分服务

依据以上包,实现server,比较重要的是应用,1 是超分服务,2 是融合服务,由于rtsp 协议非常普遍,可能还需要拉流rtsp,由于ffmpeg 能够拉流解码,所以拉流这部分可以直接使用ffmpeg

相关文章:

  • 详解调用钉钉AI助理消息API发送钉钉消息卡片给指定单聊用户
  • Layui表单查询导出
  • IDEA激活失败--脚本分析
  • 实习结帖(flask加上AIGC实现设计符合OpenAPI要求的OpenAPI Schema,让AIGC运行时可以调用api,协助公司门后迁移新后端等)
  • 以太网交换安全:MAC地址表安全
  • 51单片机学习第六课---B站UP主江协科技
  • 读数据湖仓04数据架构与数据工程
  • SkyWalking 自定义链路追踪
  • 【ShuQiHere】从机器语言到汇编语言:深入理解 LC-3 编程 ️
  • 矩阵学习过程中的一些思考
  • 万界星空科技铜拉丝行业MES系统,实现智能化转型
  • 7天的Django实战学习计划
  • ECharts 快速使用
  • mybatisplus的查询,分页查询,自定义多表查询,修改的几种写法
  • class 030 异或运算的骚操作
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • angular学习第一篇-----环境搭建
  • CentOS7简单部署NFS
  • Consul Config 使用Git做版本控制的实现
  • CSS 提示工具(Tooltip)
  • css布局,左右固定中间自适应实现
  • js算法-归并排序(merge_sort)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • nginx 负载服务器优化
  • vuex 笔记整理
  • Yeoman_Bower_Grunt
  • 初识 webpack
  • 工程优化暨babel升级小记
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 回顾 Swift 多平台移植进度 #2
  • 技术发展面试
  • 通过npm或yarn自动生成vue组件
  • 应用生命周期终极 DevOps 工具包
  • 走向全栈之MongoDB的使用
  • 仓管云——企业云erp功能有哪些?
  • 容器镜像
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​一些不规范的GTID使用场景
  • #AngularJS#$sce.trustAsResourceUrl
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (35)远程识别(又称无人机识别)(二)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转载)hibernate缓存
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .Net 6.0 Windows平台如何判断当前电脑是否联网
  • .NET Core 中的路径问题
  • .NET Remoting学习笔记(三)信道