流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)
出于好奇与学习兴趣, 我将项目中使用过的各种通信协议进行了详细整理与总结。在开发过程中, 大多数通信机制主要用于实现即时显示与数据同步传输, 并采用专用通信协议将数据传递至控制台进行实时处理, 这种方式能够保证即时显示, 并保证延迟不超过200毫秒。然而, 若直接套用此类通信协议可能会导致延迟显著增加, 即使在直播过程中出现短暂的延迟也不会影响用户体验。大家都知道, 在直播过程中偶尔会有几秒钟的时间差, 而实时播放场景则更适合采用其他类型的数据传输方案。
总结自网络,自己记的笔记
一、流媒体概述
近年来,多类型网络直播(包括视频、游戏和竞技类)已成为行业内关注的焦点。本文主要探讨了直播协议及相关的视频分发技术。
即所谓的流动媒介是基于互联网实现的一种实时性媒介播放方式。流动媒介也被称作是实时性媒介传输的方式。这种实现实体传送模式下会将视频或者音频信息传递至接收端 servers进行处理与存储。接着会将这些信息视为分片发送到网络上以便于接收端进行处理与重组最终恢复出完整的原始多媒体文件内容。
通过特殊的压缩手段将视频、音频等多种媒体文件分割成一个个独立的压缩包,并经由服务器持续不断地将这些压缩包发送至用户的计算机端设备。对于采用流式传输技术的应用场景而言,在这种情况下用户无需等待完整文件下载即可开始观看内容;相反地,在传统非流式下载模式下,则需要等待整个文件完成下载才可欣赏其中的部分内容。相比传统模式,在这种技术下启动过程仅需几秒钟到几十秒的时间段,在此期间用户的设备即可通过内置或外置的媒体解码器开始处理并展示这些压缩后的视频或音频内容;随后剩余的数据会继续接收并存储于本地设备中直至全部内容被完整展示完毕为止。
二、流媒体协议
常见的有这些协议:RTP等。它们位于应用层,并运行在tcp和udp网络上。实时传输protocol为real-time transmission protocol, real-time control protocol等


一个典型的流媒体传输过程方式如下,具体后面讲。

一个rtsp协议的客户端和服务端的方式如下。



http协议方式

有了上面的概念,再来学习它们的区别。
流媒体直播协议
1、RTP :
RTP (Real-time Transport Protocol)
RTP是用于Internet上针对多媒体数据流的一种传输层协议。结合下图看,RTP 协议和 RTP 控制协议 RTCP 一起使用,
而且它是建立在 UDP 协议上的。RTP 不像http和ftp可完整的下载整个影视文件,它是以固定的数据率在网络上发送数据,
客户端也是按照这种速度观看影视文件,当影视画面播放过后,就不可以再重复播放,除非重新向服务器端要求数据。
为啥要用udp,做个音视频传输的都知道,网络不稳定时,丢了数据,也没关系,顶多画面花屏,如果用tcp重传,那就卡顿了,一直在发送几秒前的视频,没有实时性了。
c

2、RTCP
RTCP即为 Real-time Transport Control Protocol 之一;此外还包括 RTP Control Protocol;同时该协议也可简称为 RTCP
RTCP即实时传输控制协议,是实时传输协议(RTP)的一个姐妹协议。RTP 协议和 RTP控制协议(RTCP) 一起使用,
而且它是建立在UDP协议上的。
rtcp是传输控制命令的,rtp是传输数据的。
c
3、RTSP
RTSP:(Real Time Streaming Protocol)
RTSP是用来控制声音或影像的多媒体串流协议,RTSP 提供了一个可扩展框架,使实时数据,如音频与视频的受控、点播成为可能。媒体数据使用rtp,rtcp协议。一般使用udp作为传输层。适合IPTV场景。数据源包括现场数据与存储在剪辑中的数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、多播UDP与TCP提供途径,并为选择基于RTP上发送机制提供方法传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,比较能容忍网络延迟。rtsp用来建立连接,控制传输的。RTSP以C/S模式工作,它是一个多媒体播放控制协议,主要用来使用户在播放流媒体时可以像操作本地的影碟机一样进行控制,即可以对流媒体进行暂停/继续、后退和前进等控制
c
RTSP 与 RTP 最大的区别在于:RTSP 是一种双向实时数据传输协议,在播放文件非实时流时,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作。当然,RTSP 可基于 RTP 来传送数据,还可以选择 TCP、UDP、组播 UDP 等通道来发送数据,具有很好的扩展性。它时一种类似与http协议的网络应用层协议。RTSP在制定时较多地参考了HTTP/1.1协议,甚至许多描述与HTTP/1.1完全相同。RTSP之所以特意使用与HTTP/1.1类似的语法和操作,在很大程度上是为了兼容现有的Web基础结构,正因如此,HTTP/1.1的扩展机制大都可以直接引入到RTSP中。
c
4、RTMP
RTMP(Real Time Messaging Protocol)
Macromedia 开发的一套视频直播协议,现在属于 Adobe。和 HLS 一样都可以应用于视频直播,基于TCP不会丢失。区别是 RTMP 基于 flash 无法在 iOS 的浏览器里播放,但是实时性比 HLS 要好。RTMP实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输 开发的开放协议。iOS 代码里面一般常用的是使用 RTMP 推流,可以使用第三方库 librtmp-iOS 进行推流,librtmp 封装了一些核心的 API 供使用者调用。
RTMP 协议也要客户端和服务器通过“握手”来建立 RTMP Connection,然后在Connection上传输控制信息。RTMP 协议传输时会对数据格式化,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把Message划分为带有 Message ID的Chunk,每个Chunk可能是一个单独的Message,也可能是Message的一部分,在接受端会根据Chunk中包含的data的长度,message id和message的长度把chunk还原成完整的Message,从而实现信息的收发。
c
5、HTTP协议
HTTP的视频协议,主要是在互联网普及之后。在互联网上看视频的需求下形成的。
最初的HTTP视频协议,没有任何特别之处,就是通用的HTTP文件渐进式下载。本质就是下载视频文件,而利用视频文件本身的特点,就是存在头部信息,和部分视频帧数据,就完全可以解码播放了。显然这种方式需要将视频文件的头部信息放在文件的前面。有些例如faststart工具,就是专门做这个功能的。
但是最为原始的状态下,视频无法进行快进或者跳转播放到文件尚未被下载到的部分。这个时候对HTTP协议提出了range-request的要求。这个目前几乎所有HTTP的服务器都支持了。range-request,是请求文件的部分数据,指定偏移字节数。在视频客户端解析出视频文件的头部后,就可以判断后续视频相应的帧的位置了。或者根据码率等信息,计算相应的为位置。
优点:
HTTP Live Streaming 还有一个巨大优势:自适应码率流播(adaptive streaming)。效果就是客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整。使用起来也非常简单。
缺点:
实时性相对较差,直播的时候延迟比较高。
c
6、HLS
HLS:HTTP Live Streaming(HLS)
HLS是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播 和点播 ,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。
HLS 点播,基本上就是常见的分段HTTP点播,不同在于,它的分段非常小。相对于常见的流媒体直播协议,例如RTMP协议、RTSP 协议、MMS 协议等,HLS 直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。
HLS 协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS 是以点播的技术方式来实现直播。由于数据通过 HTTP 协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
c
7、WebRTC:
web端实现流媒体的协议。google刚推出WebRTC的时候巨头们要么冷眼旁观,要么抵触情绪很大。使用RTP协议传输
c
8、RTMP
RTMP(Real Time Messaging Protocol)实时消息传送协议
是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。
它有三种变种:
1)工作在TCP之上的明文协议,使用端口1935;
2)RTMPT封装在HTTP请求之中,可穿越防火墙;
3)RTMPS类似RTMPT,但使用的是HTTPS连接;
RTMP协议(Real Time Messaging Protocol)是被Flash用于对象,视频,音频的传输.这个协议建立在TCP协议或者轮询HTTP协议之上.
RTMP协议就像一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视/音频数据.
一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.
c
RTMP与TCP及UDP对比
. UDP是一种不可靠的数据传输协议,
在发送端,在这种情况下,
UDP的数据传输速率主要取决于应用程序生成数据的速度,
受限于计算机处理能力及网络带宽。
接收端则将每个消息分段存入队列中,
程序从队列中依次读取消息分段。
值得注意的是,
UDP无需维持连接状态信息,
并假设所有数据分段都能成功到达接收端。
相比TCP而言,
其网络负载量更低,
但传输速率也更快一些。
然而,在网络流量高峰期时,
由于更多数据分段可能出现丢失现象。
. RTMP协议是一个专为快速传输视频、音频以及数据而设计的协议。它通过建立一个二进制TCP连接或连接HTTP隧道来实现在线播放与同步音频。
在RTMP数据中存在一种具有重要地位的数据类型,在这种情况下一旦有任何客户端进行数据修改时,在这种情况下共享对象会及时更新服务器端的数据这使得各个客户端都能及时感知到数据的变化情况
相比传统媒介服务器使用的媒介协议类型更为丰富的是RTMP(Real-Time Multicast Protocol)。该技术能够实现声音、影像以及脚本数据在服务器与客户端之间双向传输。而RTMP则通过分别对声音、影像以及脚本数据进行独立处理实现了更加精细的管理机制。
声音和视频数据分别地存储在服务器的不同缓存区域中。
当声音缓冲器中的数据达到极限时,则会清除所有缓存区内的信息,并从最近到达的数据开始重新收集并发送给各个客户端。
视频数据同样采用类似的方法进行处理,只不过区别在于只有当新的关键帧抵达时才会清除缓存区的内容。
每当丢弃旧的帧数据后(即删除过期的条目),系统会检查客户端是否存在错误信息。如果发现有误,则会将最新的新旧两个版本的关键帧进行匹配。
RTMP会对数据进行优先级区分。 在实时对话中,在声音发挥关键性作用的同时,在影像分配较低优先级的情况下,在脚本数据上则获得介于声音与影像之间的优先权。
该协议支持生成多个数据流的同时实现单向传输特性。
通过使用RTMP技术构建这样的系统架构时,
客户端能够同时实现与RTMP服务器以及应用服务器的数据交互,
从而使得服务端的负荷得以分散。
尽管在优化后的系统架构中,
RTMP服务器对性能需求较高。

RTSP协议与HTTP协议区别
1 RTSP引入了几种新的方法,比如DESCRIBE、PLAY、SETUP 等,并且有不同的协议标识符,RTSP为rtsp 1.0,HTTP为http 1.1;
2 HTTP是无状态的协议,而RTSP为每个会话保持状态;
3 RTSP协议的客户端和服务器端都可以发送Request请求,而在HTTPF协议中,只有客户端能发送Request请求。
4 在RTSP协议中,载荷数据一般是通过带外方式来传送的(除了交织的情况),及通过RTP协议在不同的通道中来传送载荷数据。而HTTP协议的载荷数据都是通过带内方式传送的,比如请求的网页数据是在回应的消息体中携带的。
5 使用ISO10646(UTF-8) 而不是ISO 8859-1,以配合当前HTML的国际化;
6 RTSP使用URI请求时包含绝对URI。而由于历史原因造成的向后兼容性问题,HTTP/1.1只在请求中包含绝对路径,把主机名放入单独的标题域中;
c

原文链接:
RTSP重要术语
集合控制(Aggregatecontrol ):
对多个流的同时控制。对音频/视频来讲,客户端仅需发送一条播放或者暂停消息就可同时控制音频流和视频流。
2. 实体(Entity):
作为请求或者回应的有效负荷传输的信息。由以实体标题域(entity-header field)形式存在的元信息和以实体主体(entity body)形式存在的内容组成
3. 容器文件(Containerfile):
可以容纳多个媒体流的文件。RTSP服务器可以为这些容器文件提供集合控制。
4. RTSP会话(RTSP session ):
RTSP交互的全过程。对一个电影的观看过程,会话(session)包括由客户端建立媒体流传输机制(SETUP),使用播放(PLAY)或录制(RECORD)开始传送流,用停止(TEARDOWN)关闭流。
c


该方案采用RTSP方法进行视频流传输管理,并包含以下RTSP请求类型:OPTIONS(选项),DESCRIBE(描述),SETUP(设置),PLAY(播放),GET_PARAMETER(获取参数),TEARDOWN(清理)。

简单的RTSP消息交互过程
C表示RTSP客户端,S表示RTSP服务端


服务器接收到OPTIONS请求后,将服务器能够提供的消息传给客户端。
服务器接收到DESCRIBE请求后,将SDP信息传给客户端。
服务器接收到SETUP请求后,建立RTP套接字,连接客户端RTP端口,等待发送RTP包。
服务器接收到拉流端PALY请求后,开始发送RTP包。
服务器接收到PAUSE 请求后,临时停止发送RTP包。使用 PLAY 来重新启动数据交互。
ANNOUNCE:(1)C->S:客户端向服务器端发布URL指定的媒体信息描述;(2) S->C:实时更新对话描述。
RECORD:请求录制指定范围的媒体数据,请求中可指定录制的起止时间戳;若未指定时间范围,则使用presentation description中的开始和结束时间,这种情况下,如果会话已开始,则立即启动录制操作。
服务器接收到GET_PARAMETER请求后,将当前时间传递给客户端。
服务器接收到TEARDOWN请求后,停止发送RTP包,释放资源,停止接收RTSP请求,进入等待客户端连接状态。
c

三、测试 rtsp推拉流
1、RTSP流媒体推流
在本测试中使用FFmpeg进行操作。无需在此处讨论FFmpeg的移植问题,请确保准备一个视频MP4文件。请使用H.264编码器对视频进行解码,并采用AAC格式对音频进行解码。然后将流输出至 /live/buji1 目录下。在Ubuntu系统下完成文件准备后,请运行以下命令:
ffmpeg -re -i "/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/buji1
c
2、拉流
观看直播,浏览器访问http://127.0.0.1/buji/abc.mp4,点播

然后wirshark抓包

带有包序号的数据包,rtp协议传输的。

rtcp 传输的


完成一次基本的RTSP操作过程是:首先,客户端通过网络连接到流服务器并发起一个RTSP描述命令(DESCRIBE)。流服务器利用其反馈机制向客户端返回一个SDP描述(SDP Description),其中包含以下信息:流的数量以及所使用的媒体类型等关键参数。然后从该SDP描述中分析出所需的媒体信息后,在会话期间向每个流发送相应的RTSP建立命令(SETUP)。每个RTSP建立命令告知客户端将使用哪个端口接收媒体数据。在播放过程中(PLAY),客户端还需要提交一些控制命令以实现快进、快退以及暂停等功能。最后,在播放结束时或当客户需求停止时(TERADOWN),客户端可以发送终止命令来结束该流媒体会话
位于应用层的RTSP协议与HTTP类似,并基于TCP协议进行数据传输。其主要功能在于进行媒体信息的交互操作,并负责确定媒体传输的方式以及对流控制。上层设备如网络摄像头通过RTP(Remotely Transmitted Picture)协议进行音视频数据的传输操作。在RTSP通信过程中所传递的信息被封装到特定字段中(即称为payload),这些信息与HTTP中的payload具有相似的功能与作用,在RTSP中同样遵循基于SDP(Session Description Protocol)的标准来描述网络摄像头所包含的各种媒体流参数(包括音频与视频流的基本属性等)。因此,在获取来自网络摄像头的音视频数据时需要同时支持三个关键通信协议:即用于建立上层控制并协商数据传输方式的RTSP协议、用于描述媒体信息状态的SDP协议以及用于实现可靠数据传输的关键RTP(Real-Time Transport Protocol)。
此外,在实际应用中通常还会采用一种可选性较高的机制——即在数据链路层阶段通过RTP/RTCP协同工作以实现对实时音视频质量的有效监控(包括丢包率统计与延迟评估等)。其中RTCP是一种可选性较高的机制,在不同的应用场景下可以选择性地实现或不实现其功能。
SDP协议


v=0
o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
e=mjh@isi.edu (Mark Handley)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 31
m=application 32416 udp wb
a=orient:portrait
c

上文是一条指令用于测试录制视频文件进行RTSP分发的情况。接下来将演示如何通过调用FFmpeg API实现RTSP发布,并展示实时帧数据流的一个实例。
#include <libavformat/avformat.h>
int main(int argc, char *argv[]) {
AVFormatContext *format_ctx = NULL;
AVOutputFormat *output_format = NULL;
AVStream *stream = NULL;
AVCodecContext *codec_ctx = NULL;
AVCodec *codec = NULL;
int ret;
// 注册所有的格式和编解码器
av_register_all();
// 打开输出文件/接口
if ((ret = avformat_alloc_output_context2(&format_ctx, NULL, "rtsp", "rtsp://your_rtsp_server/stream")) < 0) {
fprintf(stderr, "Error allocating output context: %s\n", av_err2str(ret));
goto end;
}
output_format = format_ctx->oformat;
// 创建一个新的流
if (!(stream = avformat_new_stream(format_ctx, NULL))) {
fprintf(stderr, "Failed allocating stream\n");
ret = AVERROR_UNKNOWN;
goto end;
}
stream->id = format_ctx->nb_streams-1;
// 找到编码器
codec_ctx = stream->codec;
codec_ctx->codec_id = output_format->video_codec;
codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P; // 或者你需要的其他像素格式
codec_ctx->width = 640; // 视频宽度
codec_ctx->height = 480; // 视频高度
codec_ctx->time_base = (AVRational){1, 25}; // 时基为25fps
codec_ctx->bit_rate = 400000; // 设置码率
if ((ret = avio_open(&format_ctx->pb, format_ctx->filename, AVIO_FLAG_WRITE)) < 0) {
fprintf(stderr, "Could not open output URL '%s'", format_ctx->filename);
goto end;
}
// 打开编解码器并设置编解码器参数
codec = avcodec_find_encoder(codec_ctx->codec_id);
if (!codec) {
fprintf(stderr, "Codec not found\n");
ret = AVERROR_UNKNOWN;
goto end;
}
if ((ret = avcodec_open2(codec_ctx, codec, NULL)) < 0) {
fprintf(stderr, "Failed to open codec: %s\n", av_err2str(ret));
goto end;
}
// 写入文件头
if ((ret = avformat_write_header(format_ctx, NULL)) < 0) {
fprintf(stderr, "Error occurred when opening output file: %s\n", av_err2str(ret));
goto end;
}
// 编码帧并写入输出
// ...
end:
avformat_free_context(format_ctx);
return ret < 0;
}
c

RTSP是一种基于客户端/服务器(C/S)模型的信息传递协议,在这种架构下,
RTSP服务端不仅能够将音视频数据发送给客户端(即客户端拉取数据),还能够接收来自客户端发送来的音视频流(即客户端主动推送)。其中,
采用拉取模式的数据传输主要包括DESCRIBE、SETUP以及PLAY等命令,
而采用推送模式则涉及ANNOUNCE、SETUP与RECORD等指令。
需要注意的是,
这些推送与拉取两种模式之间有一些共通的操作方法,
但也会有一些独特的策略。
总体而言,
由于当前IPC协议已经广泛采用的是拉取数据的方式,
因此本文重点对这种数据传输机制进行深入探讨与剖析。
该文档详细阐述了RTSP拉流信令交互过程,在其中,RTP负责传输音视频数据序列的实时拉取请求和响应信息,并将这些信息传递给相应的应用层实体进行解码与解压处理,在此过程中还涉及到相关的同步机制问题设置与配置管理。在其中的实时同步机制中,则采用了一种基于时间戳的同步方法,并对同步延迟进行了优化处理,在此过程中还实现了对不同设备间的延迟均衡控制策略设置与参数调节功能的支持。在具体的实现过程中,则采用了多线程技术来提高系统的吞吐量与响应速度,在此过程中还实现了对网络资源的有效利用率最大化管理,并通过引入智能负载均衡算法来进一步提升系统的整体性能表现。

之前提到RTSP是一种用于媒体信息传输的协议,在其具体实现中涉及多种数据通信模式。在本节中讨论的数据传输模式主要包括TCP/IP协议族以及其分支链路层协议族(例如:TCP/UDP)。这些不同的数据通信模式又可分为单播与组播两大类,在接下来的内容中我们将分别对其特性进行详细分析
本节中使用wireshark捕获了RTSP数据包(其中仅包含一路媒体流,并且SETUP命令仅被请求一次)。

单播:UDP
1、OPTIONS


OPTINOS是客户端查询服务端支持哪些方法。
2、DESCRIBE


DESCRIBE是客户端请求服务端返回关于音视频的描述,用SDP表示。
3、SETUP


SETUP是请求音视频,这里只有视频并且视频的control是track0,如果还要音频的话就还需要再发起一次SETUP请求,请求音频数据。RTP/AVP表示使用UDP传输音视频数据,cilent_port中记录了客户端的RTP和RTCP数据接收端口,响应中server_port表示服务端的RTP和RTCP数据发送端口,
规定RTCP端口 = RTP端口 + 1。
此外SETUP响应包中还会包含Session字段,表示当前会话,后面客户端请求都要带上这个Session字段,服务器用Session区分不同的客户端。
c
4、PLAY


5、TEARDOWN
客户端与服务端断开连接,媒体结束。

RTP /TCP/RTSP
当依靠TCP协议传输RTSP/RTP时,所有命令与媒体数据均通过RTSP端口进行传输;RTP数据传输采用RTSP socket与端口配置;为确保传输成功,所有数据需先经二进制交织编码处理后方能完成传输。
在使用TCP连接时,在RTSP客户端应在SETUP阶段发起对TCP连接的需求,在SETUP命令中应当包含以下形式的Transport:
Transport: RTP/AVP/TCP;interleaved=0-1
c
上述Transmitter将指示Service端采用TCP协议传输媒体数据,并通过信道0和1交错传输流数据以及控制信息。具体而言,在这种通信机制中,默认情况下偶数号的信道被指定为媒体传输通道(data channel),而奇数号的则用于传送控制信息(control information)。进一步说明的是,在此架构下,默认情况下偶数号的通道会被用来发送媒体内容(data channel: even-numbered),而奇数号的则被用来发送各种状态反馈(control information: odd-numbered)。因此,在这种配置下,请确保如果要设置媒体传输通道为0,则相应的控制通道应为0+1=1。
RTP、RTCP与RTSP的数据共享同一个TCP通道。因此需要一种机制区分这些不同类别的信息。
RTP和RTCP数据采用$符号加1个字节作为通道标识符,并附加2个字节的数据长度信息作为前缀部分起始;而RTSP数据则不包含任何前缀信息。在第二个字节的位置上分别标识不同的通信通道
RTP基于TCP的包头比基于UDP的包头多了4个字节:
* magic固定为0x24,
* channel用来区分音视频等多路流媒体的通道,其中偶数通道为流媒体内容,奇数通道为RTCP
* len表示数据包的长度减去开始的4个字节,即len字段之后的数据长度
c




五、总结
一个完整的RTSP流媒体传输过程是:
1、RTSP信令交互阶段:
客户端向服务端发出RTSP连接请求。
服务端接收到请求后回应,并建立与之的RTSP连接。
客户端与之进行交互以讨论具体的媒体传输方案(如采用UDP或TCP等技术)。
当双方确定传输方式后,则会启动相应的媒体传输机制以创建通道。
2、采集音视频阶段:
服务端开始采集音频和视频数据。
3、音视频编码阶段:
服务端进行H.264/H.265视频编码和AAC/PCM/PCMA/PACMU音频编码。
4、RTP封装阶段:
服务器端负责处理编码后的音视频数据并将其转换为RTP数据包形式输出。
其中视频媒体采用H.264和H.265两种标准进行RTP封装处理;而音频部分则采用AAC、PCM等多种格式的RTP封装技术以确保高效传输
4、RTP封装阶段:
服务器端负责处理编码后的音视频数据并将其转换为RTP数据包形式输出。
其中视频媒体采用H.264和H.265两种标准进行RTP封装处理;而音频部分则采用AAC、PCM等多种格式的RTP封装技术以确保高效传输
5、RTP数据传输阶段: 通过选择UDP或TCP等传输方式,在线服务将RTP数据包发送给客户端。
6、客户端接收与解包阶段:
客户端解析RTP数据包。
当采用UDP传输时,客户端能够直接解码并处理RTP数据。
当采用TCP传输时,在获得RTSP会话参数后,客户端通过相应的TCP连接进行解码处理。
7、解码与播放阶段:
客户端接收到来自服务器的多媒体数据并完成解码过程。
将处理后的多媒体数据发送至播放器使其能够正常运行。
为了实现实时播放,在处理过程中采用了专有协议,并仅限于自定义头部打包处理,并通过 raw sockets 或者 socket streams发送数据到 tcp 网络上。无需如此复杂机制来处理数据传输,则整体流程更加高效
