深入理解 RTP、RTCP、RTMP、RTSP、HLS 及 live555 推拉流实现

devtools/2025/3/16 9:20:32/

流媒体技术在音视频传输中起着关键作用,其中 RTP、RTCP、RTMP、RTSP 和 HLS 是最常见的协议。本文将详细介绍它们的区别,并探讨为什么 HLS 逐渐取代 RTMP。此外,还将解析 RTSP 作为控制协议的作用,并讲解 live555 如何实现音视频的推流与拉流


1. RTP、RTCP、RTMP、RTSP、HLS 的区别

1.1 RTP(Real-time Transport Protocol)

  • 作用:RTP 是一种实时传输协议,专门用于音视频数据的传输。
  • 传输方式:通常基于 UDP,保证低延迟。
  • 特点
    • 搭配 RTCP(控制协议)用于质量监测和同步。
    • 适用于实时通信,如 VoIP、视频会议、RTSP 直播等。

1.2 RTCP(Real-time Transport Control Protocol)

  • 作用:RTCP 是 RTP 的控制协议,主要用于监测传输质量统计数据同步音视频
  • 传输方式:与 RTP 一起工作,通常在 RTP 端口号 +1 的端口上传输。
  • 特点
    • 发送接收端的统计信息(丢包率、延迟、抖动等)。
    • 允许接收端反馈 QoS(服务质量),帮助发送端调整编码或速率。
    • 在视频会议中,RTCP 还可用于参与者管理(如报告活跃用户)。

1.3 RTMP(Real-Time Messaging Protocol)

  • 作用:RTMP 是 Adobe 开发的协议,广泛用于 Flash 视频流。
  • 传输方式:基于 TCP,保持稳定传输。
  • 特点
    • 低延迟(通常在 1~3 秒)。
    • 适用于直播推流(如 OBS 直播到服务器)。
    • 需要服务器支持(如 Nginx-RTMP、Wowza)。

1.4 RTSP(Real-Time Streaming Protocol)

  • 作用:RTSP 不是传输协议,而是 流控制协议,用于管理 RTP 传输。
  • 传输方式:RTSP 控制流,RTP 负责音视频数据传输。
  • 特点
    • 提供播放、暂停、快进等控制功能。
    • 主要用于监控、IP Camera 等场景。

1.5 HLS(HTTP Live Streaming)

  • 作用:HLS 是苹果开发的流媒体协议,基于 HTTP 进行音视频分片传输。
  • 传输方式:HTTP + 分片(TS/M3U8)。
  • 特点
    • 兼容性强:适用于 Web、移动端。
    • 延迟较高(通常 10~30 秒)。
    • 支持 CDN 分发,可用于大规模直播。
协议作用传输方式主要应用
RTP传输音视频UDP视频会议、VoIP
RTCPRTP 质量控制UDP统计、同步、QoS 反馈
RTMP低延迟推流TCP直播(已被 HLS 取代)
RTSP控制音视频流RTP/RTCP监控、IP Camera
HLSHTTP 流播放HTTP视频点播、直播

2. 为什么 HLS 能替代 RTMP?

RTMP 过去是直播的主流协议,但 HLS 逐渐取代了 RTMP,主要原因有:

  1. RTMP 依赖 Flash,而 Flash 已被淘汰。
  2. HLS 兼容性更强,可直接在浏览器、iOS、Android 设备播放。
  3. HLS 支持 CDN 分发,比 RTMP 更适合大规模直播。
  4. HLS 采用 HTTP 传输,不易被防火墙拦截
  5. HLS 通过 Adaptive Bitrate(ABR)优化观看体验,支持不同网络条件下的自适应码率。

📌 HLS 的唯一缺点是延迟较高(通常 10~30 秒),但低延迟 HLS(LL-HLS)已在优化这个问题。


3. RTSP 作为控制协议的作用

为什么 RTSP URL 以 rtsp:// 开头?

  • RTSP 主要用于向服务器请求流媒体内容,就像 http:// 表示用 HTTP 请求网页一样,rtsp:// 表示用 RTSP 请求流媒体。
  • RTSP 负责建立、管理和控制流,而不是直接传输数据。
  • 音视频流通常由 RTP(Real-time Transport Protocol) 负责,RTSP 只是负责发送播放、暂停、停止等指令。

👉 RTSP 类似于 HTTP,但用于音视频流控制,而 RTP 才是传输音视频数据的协议。


4. RTSP 请求内容示例

RTSP 的交互方式和 HTTP 类似,采用 文本指令 来控制流媒体。

1. RTSP 会话建立

一个完整的 RTSP 会话通常包括:

  1. OPTIONS:查询服务器支持的功能。
  2. DESCRIBE:请求媒体描述信息(返回 SDP)。
  3. SETUP:建立 RTP 传输通道。
  4. PLAY:开始播放。
  5. PAUSE(可选):暂停播放。
  6. TEARDOWN:结束会话。

2. RTSP 请求示例

假设我们要请求 rtsp://192.168.1.100:8554/live.sdp 的视频流:

(1) OPTIONS(查询服务器支持的指令)
OPTIONS rtsp://192.168.1.100:8554/live.sdp RTSP/1.0
CSeq: 1
User-Agent: VLC/3.0.11

📌 作用:客户端请求服务器支持的 RTSP 方法。

(2) DESCRIBE(请求 SDP 媒体描述信息)
DESCRIBE rtsp://192.168.1.100:8554/live.sdp RTSP/1.0
CSeq: 2
Accept: application/sdp
User-Agent: VLC/3.0.11

📌 作用:请求流媒体的详细信息(返回 SDP)。

服务器返回 SDP(Session Description Protocol):

RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 250v=0
o=- 2890844526 2890842807 IN IP4 192.168.1.100
s=Live Stream
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
m=audio 5006 RTP/AVP 97
a=rtpmap:97 AAC/44100

📌 SDP 说明

  • m=video 5004 RTP/AVP 96:视频流通过 RTP,端口 5004 传输,格式是 H.264。
  • m=audio 5006 RTP/AVP 97:音频流通过 RTP,端口 5006 传输,格式是 AAC。

👉 RTP 负责音视频数据传输,RTSP 只是告诉客户端怎么获取这些流!


(3) SETUP(建立 RTP 传输通道)
SETUP rtsp://192.168.1.100:8554/live.sdp/trackID=0 RTSP/1.0
CSeq: 3
Transport: RTP/AVP;unicast;client_port=5004-5005
User-Agent: VLC/3.0.11

📌 作用:告诉服务器客户端要用 RTP 端口 5004-5005 接收音视频流

服务器响应:

RTSP/1.0 200 OK
CSeq: 3
Session: 12345678
Transport: RTP/AVP;unicast;client_port=5004-5005;server_port=6000-6001

📌 说明

  • Session: 12345678:会话 ID,后续请求必须带上。
  • 服务器 RTP 端口 6000-6001,客户端接收端口 5004-5005。

(4) PLAY(开始播放)
PLAY rtsp://192.168.1.100:8554/live.sdp RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0.000-
User-Agent: VLC/3.0.11

📌 作用:告诉服务器 开始发送 RTP 音视频流

服务器响应:

RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
RTP-Info: url=rtsp://192.168.1.100:8554/live.sdp;seq=12345;rtptime=67890

📌 此时,服务器就会通过 RTP 端口 5004(视频)、5006(音频)开始发送数据


(5) TEARDOWN(结束会话)
TEARDOWN rtsp://192.168.1.100:8554/live.sdp RTSP/1.0
CSeq: 5
Session: 12345678
User-Agent: VLC/3.0.11

📌 作用:关闭 RTP 传输,释放资源。


RTSP 负责控制,RTP 负责传输

操作RTSP 作用RTP 作用
OPTIONS查询服务器支持的功能-
DESCRIBE获取 SDP(描述音视频流信息)-
SETUP建立 RTP 传输通道-
PLAY请求播放音视频开始传输 RTP 音视频数据
PAUSE请求暂停停止传输 RTP
TEARDOWN关闭会话停止 RTP 传输
  • RTSP 就像 HTTP,一种文本协议,用于请求和控制流媒体
  • RTP 才是真正的音视频数据传输协议

5. RTSP 不能替代 RTCP 的原因

1. RTSP 只负责会话控制,不监控 RTP 传输质量

RTSP 主要用于:

  • 建立流媒体会话(OPTIONS、DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN)。
  • 不负责 RTP 传输的质量监控,它只是告诉服务器 “播放” 或 “暂停”,但 不会反馈丢包、延迟等网络状态

而 RTCP 主要用于:

  • 监控 RTP 传输质量,如丢包率、网络抖动、延迟变化等。
  • 接收端反馈 QoS 信息,发送端可以根据 RTCP 数据调整比特率、编码方式等,优化流媒体体验。

📌 示例:如果网络出现丢包,RTSP 并不会告诉 RTP 传输链路,而 RTCP 会主动汇报网络状态,帮助优化流媒体传输。


2. RTCP 是 RTP 的一部分,而 RTSP 只是控制协议

RTCP 是 RTP 协议的控制协议,每个 RTP 连接都有一个对应的 RTCP 连接。例如:

  • RTP 端口:5004
  • RTCP 端口:5005 (通常为 RTP 端口 +1)

RTCP 通过 UDP 传输,而 RTSP 通过 TCP 传输,它们在协议栈中完全不同:

RTSP -> TCP(用于流控制)
RTP -> UDP(用于传输音视频数据)
RTCP -> UDP(用于传输统计信息)

📌 示例:RTSP 只控制“播放”音视频,而 RTCP 监测“播放”时的网络质量,并提供反馈数据。


3. RTCP 提供音视频同步功能,而 RTSP 不能

  • RTCP 通过 Sender Report(SR)Receiver Report(RR) 实现音视频同步,确保视频和音频不会出现时间错位问题。
  • RTSP 仅仅是一个控制流协议,并不能提供这种时间同步功能。

📌 示例:如果音频比视频快 100ms,RTCP 反馈时间戳信息,播放端可进行同步调整,而 RTSP 不能。


📌 结论:RTSP 负责控制播放,而 RTCP 负责优化 RTP 传输质量,两者不能互相替代! 🚀

6. live555 推流与拉流实现

1 live555 推流协议

  • RTSP 负责建立连接和控制流
  • RTP/RTCP 负责传输音视频数据

推流流程:

  1. RTSP ANNOUNCE:声明流媒体信息。
  2. RTSP SETUP:建立 RTP 传输。
  3. RTSP RECORD:开始推流。
  4. RTP 传输音视频

示例(FFmpeg 推流到 live555):

ffmpeg -re -i input.mp4 -c:v libx264 -f rtsp rtsp://localhost:8554/test

2 live555 拉流协议

  • RTSP 负责流控制(OPTIONS、DESCRIBE、SETUP、PLAY)
  • RTP 传输音视频数据

拉流流程:

  1. RTSP DESCRIBE:请求 SDP。
  2. RTSP SETUP:建立 RTP 传输。
  3. RTSP PLAY:开始播放,RTP 传输音视频。

示例(FFmpeg 拉流):

ffmpeg -rtsp_transport tcp -i rtsp://localhost:8554/test -c copy output.mp4

📌 live555 推流和拉流都基于 RTSP 控制,而 RTP 负责真正的音视频数据传输。


7. 总结

  • RTP 负责传输音视频数据,RTCP 负责质量控制,RTSP 负责流控制,RTMP 过去用于直播但已被 HLS 取代。
  • HLS 兼容性强,适合大规模直播,虽然延迟较高,但 LL-HLS 正在优化。
  • live555 主要通过 RTSP 控制流,RTP 进行音视频数据传输。

🚀 理解这些协议,有助于选择合适的流媒体技术,优化音视频传输体验!


http://www.ppmy.cn/devtools/167508.html

相关文章

Typora最新版破解教程

引言: 原文来自知乎:https://zhuanlan.zhihu.com/p/24871306107 小编这里踩了点坑出这篇文章对此加以修正 一、下载Typora Typora 官网地址:https://typora.io Typora 中文官网地址:https://typoraio.cn 官网的最新版破解会有点…

【Python入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《Python/PyTorch极简课》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…

Linux中的基本指令(下)

目录 mv指令 more指令 less指令 head指令 tail 指令 继续理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ‒r指令 grep 指令 关机 扩展命令 zip/unzip 指令 tar指令 关于rzsz 系统间的文件互传 接上! mv指令 m…

用Python实现一个简单的猜数字游戏

标题:用Python实现一个简单的猜数字游戏 摘要: 本文将介绍如何使用Python编写一个简单的猜数字游戏。通过这个项目,你将学习到Python的基本语法、随机数生成、循环和条件判断等基础知识。 正文: 1. 游戏介绍 猜数字游戏是一个…

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯(飞控部分)六.移植2.4g通讯(遥控部分) 一.Si24Ri原理图 Si24R1芯片原理图如下: 右侧为晶振。 模块…

一次Milvus迁移的记录

前言 希望把Linux上生产环境中使用docker compose运行的milvus迁移到本地(mac os)的docker compose中 操作过程 找到了官方有两个相关的项目: https://github.com/zilliztech/milvus-backup https://github.com/zilliztech/vts 但是…我都没用,因为使…

iOS应用程序开发(图片处理器)

续上篇 iOS 编程开发图片浏览器,继续实现一个图标生成功能。 功能。 操作系统平台:MacBook(macOS) IDE:xcode 编程语言:Objective-c 以下是小程序在 iPhone 模拟器中的运行视频。也可以在 iPad 模拟器中运行。 效果图如下所示&#xff1a…

2. qt写带有槽的登录界面(c++)

我们在1.Qt写简单的登录界面(c)_c qt 设计一个简单界面-CSDN博客中写了个简单的登录界面&#xff0c;但没有槽&#xff0c;在这里写一个带有槽的界面。 1.代码 代码目录如下&#xff1a; main.cpp的代码如下&#xff1a; #include "MainWindow.h" #include <Qt…