【RTSP/RTP流媒体】6、RTP协议简单分析

RTP(实时传输协议)在多点传送(多播)或单点传送(单播)的网络服务上,提供端对端的网络传输功能,适合应用程序传输实时数据,如:音频,视频或者仿真数据。

6.1、固定头



l  版本(V)

2比特。此域定义了RTP的版本。

l  填充(P)

1比特。P=1,则此包包含一到多个附加在末端的填充比特,填充比特不算作负载的一部分。填充的最后一个字节指明可以忽略多少个填充比特。填充可能用于某些具有固定长度的加密算法,或者用于在底层数据单元中传输多个RTP包。

l  扩展(X)

1比特。若X=1,在RTP报头后面跟随一个扩展包头。

l  CSRC计数(CC)

4比特。CSRC 标识符的个数。

l  标志(M)

1比特。标志的解释由具体协议规定。它用来允许在比特流中标记重要的事件,如帧边界(通常若M =1,则为一帧数据的最后一个RTP包)。

l  负载类型(PT)

7比特。此域定义了负载的格式,由具体应用决定其解释。协议可以规定负载类型码和负载格式之间一个默认的匹配。其他的负载类型码可以通过非RTP方法动态定义。RTP发送端在任意给定时间发出一个单独的RTP负载类型。

l  序列号(sequence number)

16比特。每发送一个RTP数据包,序列号加1,接收端可以据此检测丢包和重建包序列。序列号的初始值是随机的。    

l  时间戳(timestamp)

32比特。时间戳反映了RTP数据包中第一个字节的采样时间。时间戳的初始值应当是随机的,就像序号一样。几个连续的RTP包如果是同时产生的,如:属于同一个视频帧的RTP包,将有相同的序列号。如果数据并不是以它采样的顺序进行传输,那么连续的RTP包可以包含不是单调递增(或递减)的时间戳。不同媒体流的RTP时间戳可能以不同的速率增长,而且会有独立的随机偏移量。因此,虽然这些时间戳足以重构一个单独的流的时序,但直接比较不同的媒体流的时间戳不能有效的进行同步。

l  同步源标识符(SSRC)

32比特。用以识别同步源。标识符应该被随机生成,以使在同一个RTP会话期中没有任何两个同步源有相同的SSRC识别符。

l  CSRC列表

0到15项,每项32比特。CSRC列表指出了对此包中负载内容的所有贡献源。识别符的数目在CC域中给定。若有贡献源多于15个,仅识别15个。

6.2、扩展头


若RTP头中的扩展比特位置1(X=1),则一个长度可变的头扩展部分被加到RTP固定头之后。头扩展包含16比特的长度域,指示扩展项中32比特字的个数,不包括4个字节扩展头。RTP固定头之后只允许有一个头扩展。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是MATLAB调用rtsp的示例代码: ```matlab url = 'rtsp://username:password@ip_address:port/path'; % RTSP URL vidObj = VideoReader(url); % 创建VideoReader对象 while hasFrame(vidObj) img = readFrame(vidObj); % 读取视频帧 imshow(img); % 显示视频帧 end ``` 对于C++ RTSP/RTP流媒体客户端,可以使用开源的Live555库。以下是示例代码: ```cpp #include <liveMedia.hh> #include <BasicUsageEnvironment.hh> #include <stdio.h> int main(int argc, char** argv) { TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); RTSPClient* rtspClient = RTSPClient::createNew(*env, "rtsp://username:password@ip_address:port/path", 0, "username:password"); if (rtspClient == NULL) { fprintf(stderr, "Failed to create RTSP client\n"); exit(1); } RTSPStream* rtspStream = rtspClient->streamingOverTCP() ? (RTSPStream*)new TCPStreamSink(*env) : (RTSPStream*)new UDPStreamSink(*env); if (rtspStream == NULL) { fprintf(stderr, "Failed to create RTSP stream\n"); exit(1); } rtspClient->sendDescribeCommand(continueAfterDESCRIBE, rtspStream); env->taskScheduler().doEventLoop(); // 进入事件循环 Medium::close(rtspStream); Medium::close(rtspClient); env->reclaim(); delete scheduler; return 0; } void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) { if (resultCode == 0) { rtspClient->sendSetupCommand(continueAfterSETUP, False, False); } else { fprintf(stderr, "Failed to send DESCRIBE command: %s\n", resultString); exit(1); } } void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString) { if (resultCode == 0) { rtspClient->sendPlayCommand(continueAfterPLAY); } else { fprintf(stderr, "Failed to send SETUP command: %s\n", resultString); exit(1); } } void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString) { if (resultCode != 0) { fprintf(stderr, "Failed to send PLAY command: %s\n", resultString); exit(1); } } ``` 需要注意的是,在使用Live555库时需要将其编译后才能使用。具体编译方法可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值