RTSP
RTSP(Real Timing Streaming Procotol)全称“实时流协议”,是TCP/IP协议体系下的一个应用层协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据, 用于多媒体数据的网络控制。
同:
异:
RTSP组合使用了可靠传输协议TCP(控制信息)和高效传输协议UDP(媒体数据)来串流内容给用户。支持点播和直播。
RTSP协议本身只负责传输媒体控制信息,并不负责数据传输,使用RTP(Real-time Transport Protocol)和RTCP(Real-time Control Protocol)完成数据传输和数据检测。
会话参与者(发送端和接收端)周期性的向所有参与者发送RTCP包。主要功能是为应用程序提供会话质量或广播性能质量的信息,这些信息包括发送的信息包数目、丢失的信息包数目和信息包抖动等情况。
简而言之:
协议在网络中的结构图:

会话交互过程如下图:

状态机如下图:

客户端如果一段时间内(默认是60s)没有任何响应,那么rtsp服务器就会关闭该会话,所以客户端需要发送心跳包给服务器。
| 方法 | 方向 | 要求 | 作用 |
|---|---|---|---|
| DESCRIBE | C->S | 推荐 | 获得会话描述信息 |
| ANNOUNCE | C->S,S->C | 可选 | 将请求URL识别的演示或媒体对象描述发给服务器 |
| GET_PARAMETER | C->S,S->C | 可选 | 获得会话参数 |
| SET_PARAMETER | C->S,S->C | 可选 | 设置会话参数 |
| OPTIONS | C->S,S->C | 必要 | 获得服务器的可用方法 |
| PAUSE | C->S | 推荐 | 客户端发起暂停播放请求 |
| PLAY | C->S | 必要 | 客户端发起播放请求 |
| RECORD | C->S | 可选 | 请求录制指定范围的媒体数据 |
| REDIRECT | S->C | 可选 | 服务器返回重定向地址 |
| SETUP | C->S | 必要 | 客户端请求建立会话 |
| TERADOWN | C->S | 必要 | 客户端发起关闭会话请求 |
c: client s: server
请求和回应的模板如下所示。
在请求和回应的消息头中都有一个CSeq的参数,是为了进行客户端和服务端的同步而设立的。
CSeq初始值为1,客户端每发起一个请求,该值加1。传输正确的情况下,服务端的回应中的CSeq应该与对应请求相等。
[方法] [URI] [RTSP版本]<CR LF>
[消息头]<CR LF><CR LF>
[消息体]<CR LF>
[RTSP版本] [状态码] [状态码解释]<CR LF>
[消息头]<CR LF><CR LF>
[消息体]<CR LF>
OPTIONS
用于请求服务器所支持的所有方法。
C->S OPTIONS rtsp://video.foocorp.com:554 RTSP/1.0
CSeq: 1
S->C RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, RECORD
DESCRIBE
用来请求URL指定对象的描述信息,通常描述信息使用SDP(Session Description Protocol)格式。
描述信息中比较重要的是数据传输方式、播放时长以及codec type。
C->S DESCRIBE rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 2
S->C RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 210
m=video 0 RTP/AVP 96
a=control:streamid=0
a=range:npt=0-7.741000
a=length:npt=7.741000
a=rtpmap:96 MP4V-ES/5544
a=mimetype:string;"video/MP4V-ES"
a=AvgBitRate:integer;304018
a=StreamName:string;"hinted video track"
m=audio 0 RTP/AVP 97
a=control:streamid=1
a=range:npt=0-7.712000
a=length:npt=7.712000
a=rtpmap:97 mpeg4-generic/32000/2
a=mimetype:string;"audio/mpeg4-generic"
a=AvgBitRate:integer;65790
a=StreamName:string;"hinted audio track"
从SDP信息中可以知道码流的元数据信息。
SETUP:
用于请求URL使用指定传输格式,必须在PLAY前发出。
C->S SETUP rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 3
Transport: rtp/udp;unicast;client_port=5067-5068
S->C RTSP/1.0 200 OK
CSeq: 3
Session: 12345678
Transport: rtp/udp;client_port=5067-5068;server_port=6023-6024
客户端发起的请求说明接收RTP和RTCP数据的端口,一般’-‘前面的是RTP,’-'后面的是RTCP,比如上述请求:
用接收RTP数据(音视频)的本地端口是5067,接收RTCP数据的本地端口是5068
而服务器返回的信息说明服务端对应RTP和RTCP的端口,比如上述响应:
server对应的端口是6023和6024。
重要的是,服务器端还会将该传输会话的ID带给客户端,也就是Session ID,之后客户端的请求都需要带这个唯一标识码。
另外,如果发现setup的client端口已经被强占的话,可以不用关闭会话,只需要再次调用setup来重新配置端口,不过要带上当前的Session ID。
需要说明的是,端口之间是有一定联系的。如下图:

PLAY:
用于请求服务器开始传输数据,该请求是需要排队的,执行完一个PLAY请求,再执行下一个。
另外该请求可以带Range关键字,请求不同时间点的数据,单位是秒,相当于seek操作。
C->S PLAY rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0.000- //设置播放时间的范围,单位是秒,精度小数点后三位
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
S->C RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
Range: npt=0.000000-
如果要实现快进/快退功能,也是通过PLAY cmd向服务器请求,快进/快退倍速通过Scale关键字提供,如下:
C->S PLAY rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 4
Session: 12345678
SCALE: 4 // 设置快进/快退倍速
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
S->C RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
SCALE: 4
TEARDOWN:
用于请求终止会话,停止会话相关码流,并释放资源。
C->S TEARDOWN rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 5
Session: 12345678
S->C RTSP/1.0 200 OK
CSeq: 5
C->S: ANNOUNCE rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 10
Session: 47112344
Content-Type: application/sdp
Content-Length: 332
v=0
o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
e=mjh@isi.edu(Mark Handley)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 3456 RTP/AVP 0
m=video 2232 RTP/AVP 31
S->C: RTSP/1.0 200 OK
CSeq: 10
S->C: GET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 431
Content-Type: text/parameters
Session: 12345678
Content-Length: 15
packets_received
jitter
C->S: RTSP/1.0 200 OK
CSeq: 431
Content-Length: 46
Content-Type: text/parameters
packets_received: 10
jitter: 0.3838
C->S: SET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 421
Content-Length: 20
Content-type: text/parameters
barparam: barstuff // 格式<key>:<value>
S->C: RTSP/1.0 451 Invalid Parameter
CSeq: 421
Content-Length: 10
Content-type: text/parameters
barparam // 返回参数错误的键
C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 834
Session: 12345678
S->C: RTSP/1.0 200 OK
CSeq: 834
Date: 23 Jan 1997 15:35:06 GMT
C->S: RECORD rtsp://example.com/meeting/audio.en RTSP/1.0
CSeq: 954
Session: 12345678
Conference: 128.16.64.19/32492374
S->C: REDIRECT rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 732
Location: rtsp://bigserver.com:8001
Range: clock=19960213T143205Z-
RTP包的传输方式在SETUP cmd中指定,分为两种:
C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0
CSeq: 302
Transport: RTP/AVP;unicast;client_port=4588-4589
S->C: RTSP/1.0 200 OK
CSeq: 302
Date: 23 Jan 1997 15:35:06 GMT
Session: 47112344
Transport: RTP/AVP;unicast; client_port=4588-4589;server_port=6256-6257
可以看到通过UDP传输,RTP接收端口是4588,对应发送端口为6256;RTCP交互端口为4589,对应端口为6257.
C->S: SETUP rtsp://foo.com/bar.file RTSP/1.0
CSeq: 2
Transport: RTP/AVP/TCP;interleaved=0-1
S->C: RTSP/1.0 200 OK
CSeq: 2
Date: 05 Jun 1997 18:57:18 GMT
Transport: RTP/AVP/TCP;interleaved=0-1
通过TCP传输的话,RTSP cmd、RTP packet和RTCP packet是在同一个TCP连接上传输的,示意图如下:

点播的case,如何判断End of stream?
1> 服务器主动发"ANNOUNCE" cmd告诉player码流传输结束。
S->C: ANNOUNCE rtsp://172.16.12.6:5554/… RTSP/1.0
CSeq: 4
Session: 370384394
x-notice: 2101 "End-of-Stream Reached" event-data=20210706T025811Z
2> 可以从DESCRIBE的SDP info中拿到duration,那么播放时长(playtime + 1)达到duration,那就认为数据传输结束。
3> 最新的规范(RTSP 2.0)中,服务器发送"PLAY_NOTIFY"cmd给客户端,通知eos。
S->C: PLAY_NOTIFY rtsp://example.com/… RTSP/2.0
Cseq:854
Notify-Reason: end-of-stream
4>无法拿到duration,那么设置100秒超时,如果100秒内server没有发送播放数据给player,那就认为数据传输结束。
RTSP重定向的情况:
DESCRIBE请求返回303说明要进行重定向,响应头中会说明重定向的url。
客户端需要对重定向url重新进行OPTION和DESCRIBE请求。
C->S:
DESCRIBE rtsp://172.16.74.210:559/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 2
User-Agent: MODPlayer
S->C:
RTSP/1.0 303 See Other
Server: Orbit2x
CSeq: 2
Location: rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg
C->S:
OPTIONS rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 1
User-Agent: MODPlayer
S->C:
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER
C->S:
DESCRIBE rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 2
User-Agent: MODPlayer
S->C:
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 2
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER
Content-Type: application/sdp
Content-Length: 178
媒体数据直接基于UDP传输:
transport是RAW/RAW/UDP,传输的数据没有封包为RTP包,直接以UDP包的形式传输。
SETUP rtsp://172.17.245.46:554/378289119.ts RTSP/1.0
Transport: RAW/RAW/UDP;unicast;destination=10.134.37.122;client_port=15500
User-Agent: MODPlayer
CSeq: 3
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 3
Session: 26931165;timeout=60
Transport: RAW/RAW/UDP;unicast;destination=10.134.37.122;client_port=15500;source=172.17.245.46;server_port=10000
-----------------
udp的url是:udp://172.17.245.46:10000 --> 注意这是一个单播地址,不是udp组播地址(224. ~ 239.)
SDP:
SDP(Session Description Protocol)是一个用来描述多媒体会话的应用层控制协议,是一个基于文本的协议。
用来会话建立过程中的媒体类型,以及协商编码方案等。
SDP由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式视<类型>而定。
SDP文本行例子:
v=<version> (协议版本)
o=<username> <session id> <version> <network type> <address type> <address> (所有者/创建者和会话标识符)
s=<session name> (会话名称)
i=<session description> (会话信息)
u=<URI> (URI 描述)
e=<email address> (Email 地址)
p=<phone number> (电话号码)
c=<network type> <address type> <connection address> (连接信息)
b=<modifier>:<bandwidth-value> (带宽信息)
t=<start time> <stop time> (会话活动时间)
r=<repeat interval> <active duration> <list of offsets from start-time>(0或多次重复次数)
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key> (加密密钥)
a=<attribute> (0 个或多个会话属性行)
a=<attribute>:<value>
m=<media> <port> <transport> <fmt list> (媒体名称和传输地址)
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su