其他分享
首页 > 其他分享> > 流媒体-RTSP协议-live555学习-打开RTSP流(一)

流媒体-RTSP协议-live555学习-打开RTSP流(一)

作者:互联网

文章目录

live555源码编译安装

LIVE555 Streaming Media

官网及说明

编译live555可执行文件及动态库

./genMakefiles <os-platform>

是编译平台,如"linux" 或者 “solaris。在 “config.” 文件中定义. 执行此指令会在"live” 文件夹中生成 Makefile文件和子目录。

复制config.linux-with-shared-libraries文件改名为linux-with-shared-libraries,依次执行

./genMakefiles linux
./genMakefiles linux-with-shared-libraries
make -j7
make install

库及可执行文件说明

在/usr/local/include下生成BasicUsageEnvironment groupsock liveMedia UsageEnvironment
头文件子文件夹,在/usr/local/bin下生成可执行文件,在/usr/local/lib下生成动态库。

LiveMedia库

包含一系列处理不同编码格式和封装格式的类,基类是Medium。

UsageEnvironment库

环境类,用于错误信息的输出。LIVE555中多数类中均包含此类对象指针。其内部包含TaskSchedule抽象类的指针,该类用于任务调度,因此所有包含UsageEnvironment指针的类均可将自己加入到调度中。

BasicUsageEnvironment库:

包含具体环境类和具体TaskScheduler类。UsageEnvironment用于对错误信息的处理,BasicUsageEnvironment类用于以控制台方式输出错误信息。因此想要以其他方式输出错误信息的类,可以从UsageEnvironment派生。BasicTaskSchedule类继承自TaskScheduler抽象类,用以定义具体的调度策略。任何基于LIVE555的应用程序均需要定义自己的BasicEnvironment和TaskScheduler库。如果创建窗口应用程序,在重定义TaskScheduler时,需要与图形环境自己的事件处理框架集成。BasicTaskSheduler使用select模型实现事件的获取和处理。如果想使用更高效的IOCP模型,可以定义自己的BasicTaskScheduler类。BasicTaskScheduler内部有一个循环,循环读取队列中的消息并处理。整个基于BasicTaskScheduler的程序只有一个线程驱动。

GroupSock库

对各种socket操作的封装,用于收发数据。主要面向组播,但也可以进行单播的收发数据,仅支持UDP,不支持TCP。

MediaServer 服务器程序

该程序使用BasicUsageEnvironment库实现,因此是一个控制台程序。任务调度类是BasicTaskScheduler类,因此使用Select模型且仅有一个线程在循环处理各种事件。后期如果有时间会实现基于IOCP的MediaServer服务器程序。

其他测试Demo

基于LIVE555实现的客户端程序,

RTSP协议

CRLF是Carriage-Return Line-Feed的缩写,意思是回车换行,就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。换行在有的ASCII码表也用newline(简nl)来进行表示,这里的lf是line feed的概念,意思是一样的。

解析打开HIKViso网络摄像头RTSP流

在testProgs文件夹执行可执行文件:openRTSP rtsp://admin:admin@192.168.0.64,以下是显示打开rtsp流的请求与回复消息报文:

Created new TCP socket 3 for connection
Connecting to 192.168.0.64, port 554 on socket 3...
...remote connection opened

//step1:
//C->S:OPTION request //询问S有哪些方法可用
//S->C:OPTION response //S回应信息中包括提供的所有可用方法
Sending request: OPTIONS rtsp://admin:admin@192.168.0.64 RTSP/1.0
CSeq: 2    //每个消息都有序号来标记,第一个包通常是option请求消息
User-Agent: openRTSP (LIVE555 Streaming Media v2020.12.03)


Received 153 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
CSeq: 2   //每个回应消息的cseq数值和请求消息的cseq相对应
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER  //服务器提供的可用的方法
Date:  Fri, Dec 11 2020 13:52:50 GMT


//step2:
//C->S:DESCRIBE request //要求得到S提供的媒体初始化描述信息
//S->C:DESCRIBE response //S回应媒体初始化描述信息,主要是sdp
Sending request: DESCRIBE rtsp://admin:admin@192.168.0.64 RTSP/1.0
CSeq: 3
User-Agent: openRTSP (LIVE555 Streaming Media v2020.12.03)
Accept: application/sdp


Received 712 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
CSeq: 3
Content-Type: application/sdp
Content-Base: rtsp://admin:admin@192.168.0.64/
Content-Length: 577

v=0
o=- 1607694770912109 1607694770912109 IN IP4 192.168.0.64
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://admin:admin@192.168.0.64/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://admin:admin@192.168.0.64/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AKpWoHgCJ+WbgICAgQA==,aO48gA==
a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

Opened URL "rtsp://admin:admin@192.168.0.64", returning a SDP description:
v=0
o=- 1607694770912109 1607694770912109 IN IP4 192.168.0.64
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://admin:admin@192.168.0.64/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://admin:admin@192.168.0.64/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AKpWoHgCJ+WbgICAgQA==,aO48gA==
a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

Created receiver for "video/H264" subsession (client ports 37436-37437)


//step3:
//C->S:SETUP request //设置会话的属性,以及传输模式,提醒S建立会话
//S->C:SETUP response //S建立会话,返回会话标识符,以及会话相关信息
//uri中 带有trackID=0,表示对该通道进行设置。Transport参数设置了传输模式,包的结构。接下来的数据包头部第二个字节位置就是interleaved,
//它的值是每个通道都不同的,trackID=0的interleaved值有两个0或1,0表示rtp包,1表示rtcp包,接收端根据interleaved的值来区别是哪种数据包。
Sending request: SETUP rtsp://admin:admin@192.168.0.64/trackID=1 RTSP/1.0
CSeq: 4
User-Agent: openRTSP (LIVE555 Streaming Media v2020.12.03)
Transport: RTP/AVP;unicast;client_port=37436-37437


Received 204 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
CSeq: 4
Session:       1297900659;timeout=60  //服务器回应的会话标识符
Transport: RTP/AVP;unicast;client_port=37436-37437;server_port=8236-8237;ssrc=6bad0a52;mode="play"
Date:  Fri, Dec 11 2020 13:52:50 GMT


Setup "video/H264" subsession (client ports 37436-37437)
Created output file: "video-H264-1"
//step4:
//C->S:PLAY request //C请求播放
//S->C:PLAY response //S回应该请求的信息
Sending request: PLAY rtsp://admin:admin@192.168.0.64/ RTSP/1.0
CSeq: 5
User-Agent: openRTSP (LIVE555 Streaming Media v2020.12.03)
Session: 1297900659
Range: npt=0.000-   //设置播放时间的范围


Received 186 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
CSeq: 5
Session:       1297900659
RTP-Info: url=rtsp://admin:admin@192.168.0.64/trackID=1;seq=13619;rtptime=1760468580 //seq和rtptime都是rtp包中的信息
Date:  Fri, Dec 11 2020 13:52:50 GMT


//step5:
//C->S:TEARDOWN request //C请求关闭会话
//S->C:TEARDOWN response //S回应该请求
Started playing session
Receiving streamed data (signal with "kill -HUP 14762" or "kill -USR1 14762" to terminate)...
Got shutdown signal
Sending request: TEARDOWN rtsp://admin:admin@192.168.0.64/ RTSP/1.0
CSeq: 7
Authorization: Digest username="admin", realm="IP Camera(C9760)", nonce="263f209bfeee2a6093bbd48b583042b6", uri="rtsp://admin:admin@192.168.0.64/", response="a9a25cbe70f2e57e610eb8e59d445731"
User-Agent: openRTSP (LIVE555 Streaming Media v2020.12.03)
Session: 1844432362

SDP格式

v=<version>
o=<username> <session id> <version> <network type> <address type> <address>
s=<session name>
i=<session description>
u=<URI>
e=<email address>
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>
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key>
a=<attribute>
a=<attribute>:<value>
m=<media> <port> <transport> <fmt list>
v = (协议版本)
o = (所有者/创建者和会话标识符)
s = (会话名称)
i = * (会话信息)
u = * (URI 描述)
e = * (Email 地址)
p = * (电话号码)
c = * (连接信息)
b = * (带宽信息)
z = * (时间区域调整)
k = * (加密密钥)
a = * (0 个或多个会话属性行)
//时间描述:
t = (会话活动时间)
r = * (0或多次重复次数)
//媒体描述:
m = (媒体名称和传输地址)
i = * (媒体标题)
c = * (连接信息 — 如果包含在会话层则该字段可选)
b = * (带宽信息)
k = * (加密密钥)
a = * (0 个或多个媒体属性行)

参考文献

  1. RTSP协议学习

标签:live555,流媒体,admin,RTSP,192.168,0.64,rtsp,response
来源: https://blog.csdn.net/bwangk/article/details/112972065