一 概述

RTSP(Real Time Streaming Protocol),RFC2326,实时音视频流传输协议,是TCP/IP协议体系中的一个应用层协议。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。

在整个rtsp传输过程中,分别涉及到以下协议

rtsp传输协议建立会话,用于客户端和服务端之间的信息交互,流媒体参数的传输为音视频留的传输提供交互基础

rtp包在会话建立后,负责将音视频数据打包发送,在每一帧数据前加上rtp包头,用于客户端更快的识别处理数据

rtcp在传输影视频数据时,在客户端和服务端之间传输控制命令,控制音视频留的传输与播放等

RTSP URL格式示例:

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream

二 交互过程概述

RTSP 常用请求有下面几种

RTSP 常用方法

交互流程图如下

client

serve

1.OPTIONS request

1.OPTIONS response

2.DESCRIBE request

2.DESCRIBE response

3.SETUP request

3.SETUP response

4.PLAY request

4.PLAY response

5.Media data Transfer

5.Control Command reauest

6.TEARDOWN request

6.TEARDOWN response

client

serve

流程解析:

1.OPTIONS:

客户端向服务端查询当前服务端当前可用的方法

2.DESCRIBE:

客户端向服务端请求当前媒体的描述信息,包括视频和音频的格式参数,服务端将当前对应的媒体参数填入SDP信息中,回复给客户端 (SDP信息将在后续文章中进行更新)

3.SETUP

请求建立会话,服务端根据客户端的信息,决定媒体数据传输的模式interleaved模式(使用TCP传输),非interleaved模式(使用udp传输),当使用udp传输时,此时应该建立两个UDP套接字,用于传输媒体出具,和RTCP控制数据,并在回复中写入创建套接字的端口

4.PLAY

客户端请求播放,服务端确认后回复,

5.Media Data Transer

传输媒体数据,以及RTCP控制协议。如果客户端要求视频的暂停,播放,快进,快退等,都是在RTCP数据中发出请求,

此外如果做再IPC领域做双向对讲功能,也可把客户端的音频数据,通过RTCP传输给服务端

6.TEARDOWN

客户端请求关闭视频,服务端回复后关闭

三 RTSP交互过程示例

请求消息格式:

方法 URI RTSP版本 CR LF

消息头 CR LF CR LF

消息体 CR LF

回应消息格式:

RTSP版本 状态码 解释 CR LF

消息头 CR LF CR LF

消息体 CR LF

状态码由三位数组成,表示方法执行的结果,定义如下:

1XX:保留,将来使用;

2XX:成功,操作被接收、理解、接受(received,understand,accepted);

3XX:重定向,要完成操作必须进行进一步操作;

4XX:客户端出错,请求有语法错误或无法实现;

5XX:服务器出错,服务器无法实现合法的请求

下面一则示例为 rtsp会话交互时的报文内容,不包括音视频数据包和RTCP控制命令包:

  1. option

    请求

    OPTIONSrtsp://192.168.20.136:5000/xxx666RTSP/1.0

    CSeq: 1 //每个消息都有序号来标记,第一个包通常是option请求消息

    User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10) //浏览器标识

    回复

    RTSP/1.0 200 OK

    Server: UServer 0.9.7_rc1

    Cseq: 1 //每个回应消息的cseq数值和请求消息的cseq相对应

    Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE, GET_PARAMETER //服务器提供的可用的方法

  2. describe

    请求

    DESCRIBErtsp://192.168.20.136:5000/xxx666RTSP/1.0

    CSeq: 2

    token:

    Accept: application/sdp

    User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

    回复

    RTSP/1.0 200 OK

    Server: UServer 0.9.7_rc1

    Cseq: 2

    x-prev-url: rtsp://192.168.20.136:5000

    x-next-url: rtsp://192.168.20.136:5000

    x-Accept-Retransmit: our-retransmit

    x-Accept-Dynamic-Rate: 1

    Cache-Control: must-revalidate

    Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT

    Date: Fri, 10 Nov 2006 12:34:38 GMT

    Expires: Fri, 10 Nov 2006 12:34:38 GMT

    Content-Base: rtsp://192.168.20.136:5000/xxx666/

    Content-Length: 344

    Content-Type: application/sdp

    v=0 //以下都是sdp信息 描述此次媒体信息的格式

    o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136

    s=/xxx666

    u=http:///

    e=admin@

    c=IN IP4 0.0.0.0

    t=0 0

    a=isma-compliance:1,1.0,1

    a=range:npt=0-

    m=video 0 RTP/AVP 96 //m表示媒体描述,下面是对会话中视频通道的媒体描述

    a=rtpmap:96 MP4V-ES/90000

    a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307

    a=control:trackID=0 //trackID=0表示视频流用的是通道0

  3. setup

    请求

    SETUPrtsp://192.168.20.136:5000/xxx666/trackID=0RTSP/1.0

    CSeq: 3

    Transport: RTP/AVP/TCP;unicast;interleaved=0-1 //

    User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

    回复

    RTSP/1.0 200 OK

    Server: UServer 0.9.7_rc1

    Cseq: 3

    Session: 6310936469860791894 //服务器回应的会话标识符

    Cache-Control: no-cache

    Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567

  4. play

    请求

    PLAYrtsp://192.168.20.136:5000/xxx666RTSP/1.0

    CSeq: 4

    Session: 6310936469860791894

    Range: npt=0.000- //设置播放时间的范围

    User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

    回复

    RTSP/1.0 200 OK

    Server: UServer 0.9.7_rc1

    Cseq: 4

    Session: 6310936469860791894

    Range: npt=0.000000-

    RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309

  5. teardown

    请求

    TEARDOWNrtsp://192.168.20.136:5000/xxx666RTSP/1.0

    CSeq: 5

    Session: 6310936469860791894

    User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

    回复

    RTSP/1.0 200 OK

    Server: UServer 0.9.7_rc1

    Cseq: 5

    Session: 6310936469860791894

    Connection: Close

四 RTSP开发要点

整个RTSP交互过程了解之后,现在来叙述一下RTSP开发过程中的重点难点,仅做开发思路指导用

1.确定RTSP服务端的架构

服务端为一个TCP套接字,监听并处理客户端发送的请求,确定好整个架构,来处理多个客户端的并发请求。

难点:

在处理setup会话后需要根据客户端请求,若客户端要求使用UDP传输视频数据,则在回复此会话钱建立两个UDP套接字,用于传输音视频数据或者RTCP控制命令。

若使用tcp传输,则使用当前会话使用的链接来传输所有的数据包,此处需要注意对客户端发送的请求加以区分。客户端来的请求中第一个字节为“$”为rtcp包,否则为RTSP会话的数据包

2.音视频数据RTP打包

以H264/H265为例,此处简要叙述,后续详细叙述

打包视频数据时,需要跳过Nalu头部,H264nalu头部为一个字节,H265nalu头部为两个字节。当数据小于指定大小事,添加RTP头部后,单包发送,当大于指定大小时,对视频数据进行分包发送。分包时,需要在每一包数据前面添加头部,用以区分当前数据包是否发送完毕,H264为2个字节,H265为三个字节,然后添加rtp包头后发送。

打包音频数据时,G711数据直接添加RTP包头后打包发送,AAC数据需要去掉AAC数据的七个字节头,并加上4个字节aac_header,然后添加RTP包头发送。

RTP报头如下

RTP报头

具体rtp打包过程将在后续更新

3.DESCRIBE中SDP描述信息

在SDP信息中描述了媒体信息----音频和视频的播放参数,注意playload type(PCMU 0, PCMA 8,H264/H265 96,AAC 97)

其次注意fmtp,视频的fmtp中需要根据具体参数(sps,pps)计算部分参数。音频的fmtp中包config参数需要计算,但对于固定格式的音频,可以提前算好,写入SDP。

4.音视频数据时间戳

音视频数据帧的时间戳单位均为:1/频率,传输数据帧时,需要将时间戳单位进行转化,当数据源为直播是,音视频时间戳不需要额外处理,可直接转化单位后使用。当来源于文件时,需要调整时间戳,因为客户端会使用音视频时间戳进行同步。

RTSP服务端开发概述的更多相关文章

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  2. Day01_搭建环境&CMS服务端开发

    学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...

  3. 在线教学、视频会议 Webus Fox(2) 服务端开发手册

    上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...

  4. Android 服务端开发之开发环境配置

    Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...

  5. Swift3.0服务端开发(三) Mustache页面模板与日志记录

    本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...

  6. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  7. 如何有效快速提高Java服务端开发人员的技术水平?

    我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...

  8. WCF服务端开发和客户端引用小结

    1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...

  9. socket服务端开发之测试使用threading和gevent框架

    socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...

随机推荐

  1. linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)

    一,prometheus的用途 Prometheus是一个开源的系统监控和警报工具包 相比其他监控系统,它更适用于微服务的体系架构 它使用各种专用exporter,用来实现对硬件/存储/数据库/web ...

  2. centos8平台redis5日志按天分割

    一,创建日志的备份目录 [root@yjweb crontab]# mkdir /data/logs/redislogsbackup 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...

  3. html中object标签

    首先将这个强大web页面打印例子(pintTest.html)贴上来. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional ...

  4. git学习(六) git reset操作

    git reset 操作 git reset git reset HEAD 文件名 移除不必要的添加到暂存区的文件 git reset HEAD^ 或者 commitid 去掉上一次的提交 git r ...

  5. 服务器免密码登录 deployer

    在本地(或者开发机)执行部署任务时我们不想每次输入密码,所以我们需要将 deployer 用户设置 SSH 免密码登录: 在本机生成 deployer 专用密钥,然后拷贝公钥: $ ssh-keyge ...

  6. ES6里class杂乱随笔

    这是一篇乱七八糟的随笔.class是ES6新增的特性,用于解决JavaScript没有类的困惑. --杂谈 ES5及之前,类都是用函数来替代,包括实例. 如: 1 function Person(na ...

  7. JavaScript实现基于对象的栈

    class Stack { constructor() { this.count = 0; this.items = {}; } push(element) { this.items[this.cou ...

  8. AWS Lambda 借助 Serverless Framework,迅速起飞

    前言 微服务架构有别于传统的单体式应用方案,我们可将单体应用拆分成多个核心功能.每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作时不会互相影响 这种设计理念被进一步应用,就变成了无 ...

  9. JUC---13各种锁

    一.公平锁与非公平锁 公平锁:加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁:加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待 非公平锁性能比公平锁高5~10倍 ...

  10. mysql presto 函数收集

    格式化日期 presto: select  date_format(CURRENT_DATE - INTERVAL '1' month, '%Y-%m') mysql:date_format(DATE ...