一 前沿

打算花两篇文章来写RTSP ,第一篇介绍RTSP 协议,第二篇介绍RTSP 是如何在FFMPEG 中实现的。RTSP 是早期的流媒体协议,协议由RealNetworks,NetScape和哥伦比亚大学合作开发,并由IETF标准化(RFC2326),现在常用于安防摄像头监控。

我们在播放rtsp 连接,并开启wireshark 抓取其网络包是发现,其中不但有rtsp 包,还有大量的rtp, rtcp 包。 这是 怎么回事?

ffplay.exe -i rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov

rtmp, rtp, rtcp 到底有什么关系?

rtmp: 它是一个文件控制协议,用于控制stream 的播放/暂替。

rtp/rtcp: 它们是一对姐妹协议,前者用来传输video/audio数据,后者用来QOS,像服务器/客户端反馈当前的网络环境,传输质量等等。他们层级关系如下:

因此RSTP 通常与RTP/RTCP 协议共同使用,其中RTSP 是服务器与客户端间的双向协议,它不负责传输音视频数据,而是用来控制多个音视频流。RTSP是基于ISO10646字符集的文本协议,基于TCP 建立会话,与HTTP1.1 很类似,例如404 代表错误码“Not Found”,200 代表“OK”。

二 RSTP 命令

上面说到RTSP 它是一个文本控制协议,类似与HTTP,用于控制音视频播放的。那么它支持哪些控制命令呢? 如下图,是抓取的网络包,发送"OPTIONS",就会返回支持的控制命令,我们可知它支持:DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,OPTIONS,ANNOUNCE,RECORD,GET_PARAMETER控制命令。

下面我们来分析一下这些命令的作用?

rtsp 播放流程如下图所示:

RTSP通过不同的命令构建完整的控制会话,同时依赖RTP和RTCP或其他协议(例如在广播电视领域,有些方案采用TS作音视频传输)传输音视频本身的数据,一次典型的播放过程将在客户端和服务器间建立5个不同的Session:一路RTSP的Session、两路RTP的Session(音频和视频各一)以及两路RTCP Session(分别对应两路RTP Session),占用5个不同的端口(RTSP协议的默认端口是554,RTP及RTCP的端口由SETUP命令指定)。 使用多达5个会话交换数据的RTSP方式流媒体传输,很像是在双向多车道的马路上奔驰,无疑很大程度上解决了交通的问题,但“成也萧何,败也萧何”,多车道对资源的占用或许就是被后来的RTMP等协议挤占的根源。

三 RTP

RTP是Real-time Transport Protocol 的简称,定义与RFC1889标准中,基于UDP 传输,设计初衷是用来传递音视频数据的,后常与RTSP,H323,SIP,WebRTC等协议配合使用。RTP协议将不同编码格式和封装格式视频,在加上RTP header 进行发送,RTP 头重要信息包括序列号,时间戳,负载格式,并且RTP协议提供抖动补偿和数据无序到达的检测机制。其RTP 头格式如下图所示,前12bit 是可选的,后面CSRC 是可选的,最多15bit。

V: 2bit, version版本号。

P:1bit, Pading , 数据是否有填充。

X: 1bit,eXtension,扩展位,该位被设置,还有个RTP extension 头

CC: 4bit,CRSC计数,用来表示CSRC的数目,用于表示RTP 数据包的来源。

M: 1 bit, 该位被设置,代表RTP 报文有特殊意义,比如每一帧的开始。

PT: 4bit ,payload Type, 载荷类型。

SN:16 bit,序列号,每发送一个同类型的RTP 包,序列号就加1 .

T: 32bit,时间戳,它反映RTP报文中数据第一个字节的采样时刻(时间)

SSRC: 32bit, Synchronization SouRce identifier, 用来识别RTP数据包的来源。

CSRC:32bit, Contributing SouRce identifier .

下面我们对照一个RTP 网络包,来看下RTP Header 的样子。

四 RTCP

实时传输控制协议(RTCP)与实时传输协议(RTP)是一对姐妹协议,它们 的IETF编码分别为:RFC 3550和RFC 3551 ,RTP 只负责传输数据,不能为传输质量提供保证,也不能提供流量控制和拥塞控制, 这需要与RTCP共同合作。

RTCP 的作用有:服务质量反馈,会话控制,信息标识,媒体间同步。

RTCP 报文类型:

1,发送端报告(SR, send report),类型号为200,S -> C。如下图抓的发送端报告,可知包含信息有ssrc确定发送源, timestamp用于计算延时, packet count 用于计算丢包率。

2 ,接收端报告(RR,receiver report),类型号为201, C -> S。如下图抓的是接收端报告网络包,包含信息有lost 丢包,延时等信息。

3,源描述项(SDES,source description items),类型号为202。如下图抓的是SDES , 其记录是的会话成员有关的标识信息。

4 ,参与结束标识(BYE, indicates End of participation),类型号为203, 用于指示关闭一个或几个数据流。

5, 特定应用功能(APP, application specific functions),类型号为204, 应用程序自定义,用于解决扩展性问题。

五 总结

本文先后介绍了RTSP,RTP,RTCP,它们分别用于播放控制,传输数据,QOS。 RTSP它是一个文本控制协议,本文介绍了其控制报文与播放控制流程。RTP 它是它是数据传输协议,本文介绍其格式组成。RTCP 它用于QOS,本文介绍了其五种报文类型。因此RTSP 流是用RTSP协议控制,RTP传输,RTCP监测的数据流。

ffmpeg 之 RTSP 一相关推荐

  1. 【FFmpeg】RTSP、RTMP相关命令及开源项目

    一.RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i "rtsp://[用户名]:[密码]@192.168.1.100/h265/ ...

  2. ffmpeg 找不到bin_FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109603499 各位读者,知识无穷而人力有穷 ...

  3. RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78214267 既然已经可以通过 RTSP 获取h264 裸流了.那么通过 F ...

  4. 音视频开发(17)---RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中 https://blog.csdn.net/qq_29350001/article/details/7821426 ...

  5. 基于FFmpeg接收RTSP的ts流

    RTSP用于建立的控制媒体流的传输,通过wireshark抓包可以看到rtsp消息交互的过程: 1. 第一步:查询服务器端可用方法 C->S:OPTION request     // 询问S有 ...

  6. ffmpeg获取rtsp h265_用FFmpeg将rtsp视频流保存成H264、h265文件

    ffmpeg:FFmpeg的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward,是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算 ...

  7. ffmpeg推rtsp、rtmp音视频流命令

    ffmpeg推rtsp.rtmp音视频流命令 rtmp流 推流 播放 rtsp流 推流 播放 原创文章禁止转载 同步发布http://www.alom.com.cn/ ffmpeg推rtsp.rtmp ...

  8. 利用ffmpeg录制rtsp流的方法总结(一)

    致敬雷霄骅(已逝):https://blog.csdn.net/leixiaohua1020/article/details/18893769 音频编码 编码技术 算法 编码标准 码率(kbit/s) ...

  9. 使用ffmpeg添加rtsp字幕流 (t140)

    如有错误请指正,谢谢. 使用ffmpeg添加rtsp字幕流 (t140) 使用ffmpeg推送一个视频文件到rtsp非常简单: ffmpeg -re -i subtitle.mkv -vcodec c ...

  10. 使用ffmpeg对rtsp视频截图

    1|ffmpeg -i rtsp://192.168.1.64:554/Streaming/Channels/1 -y -f mjpeg -t 0.001 -s 1280x720 test.jpg 使 ...

最新文章

  1. Python进阶-----类、对象的相关知识
  2. mysql 查询优化器跟踪_3. select语句执行过程-优化器
  3. select count(*)和select count(1)的区别(转载)
  4. 宽带Internet连接的类型—Vecloud微云
  5. git checkout -b mybranch和git checkout mybranch
  6. 数据结构——Java Stack 类
  7. java线程同步的实现_【Java多线程系列三】实现线程同步的方法
  8. Progress Control控件的使用
  9. 不可不知的 5 种 JavaScript 代码编辑器
  10. 知识管理夏季论坛,免费,欢迎你来!
  11. tflite C++ API 部署分类模型
  12. (附源码)spring boot宠物医院管理系统 毕业设计 180923
  13. 利用PlaySound函数播放音频文件
  14. R语言实现单变量分析教程
  15. 记第三期“晋IT”分享成长沙龙
  16. unity案例星际迷航_《星际迷航》:自1964年以来启发人们和他们的技术
  17. forward(转发)与redirect(重定向)的区别
  18. 服务器c盘有个inetpub文件夹,关于C盘中的inetpub文件夹在win10电脑中的删除处理方法...
  19. Java Graphics绘制表格和直方图
  20. 笔记本麦克风声音小解决办法

热门文章

  1. 网站制作教程:新手如何用PageAdmin建站系统做网站
  2. 7种将字符串反转的 Java 方法
  3. 微信小程序weui的引入及使用
  4. C语言解决经典问题约瑟夫环--数组
  5. #、##、#@在#define中的用法
  6. 【笔记】顶会论文程序复现供自己使用的方法
  7. PHP中终止程序输出的exit和die
  8. Storm Event Imagery Dataset 数据简介
  9. KV260(一)跑通相机例程
  10. docker中没有vi/vim命令