ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-21 21:01:22  阅读:588  来源: 互联网

标签:live555 流媒体 admin RTSP 192.168 0.64 rtsp response


文章目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有