东莞市网站建设_网站建设公司_一站式建站_seo优化
2025/12/17 13:03:25 网站建设 项目流程

前言

本文档是 RFC 3550 - RTP: A Transport Protocol for Real-Time Applications完整标准文档的中文翻译。技术术语保持与IETF官方翻译一致,代码示例和语法保持原样,包含所有关键技术和实现细节,格式和结构遵循原RFC文档

注意:实际实现时应参考英文原版RFC 3551文档

原标准文档:https://www.rfc-editor.org/rfc/rfc3550

RFC 3550 - RTP:实时应用的传输协议

网络工作组:H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson
征求意见稿:3550
分类:标准跟踪
废弃:1889
发布日期:2003年7月
更新者:5506, 5761, 6051, 6222, 7022, 7160, 7164, 8083, 8108


摘要

本文档描述了实时传输协议(RTP),该协议用于在单播或多播网络中传输实时数据,如音频、视频或模拟数据。RTP不保证实时服务,但通过与实时控制协议(RTCP)结合使用,可以提供数据传输的监控,并支持多播传输中的最低程度控制。RTP和RTCP被设计为独立于底层传输层和网络层。该协议支持使用RTP转换器和混合器的应用级组播。

RTP承载实时数据,而RTCP监控数据传输质量,并传递有关参与者的信息。RTP和RTCP被设计为独立工作,但通常成对使用。RTP承载媒体流,RTCP承载监控数据。


目录

  1. 引言
  2. 术语
  3. RTP使用场景
  4. 定义
  5. 字节序、对齐和时间格式
  6. RTP数据传输协议
  7. RTP控制协议(RTCP)
  8. RTP转换器和混合器
  9. 分层编码
  10. 轮廓和载荷格式规范
  11. 安全
  12. 拥塞控制
  13. 与RFC 1889的区别
  14. 致谢
  15. 参考文献
  16. 作者地址
  17. 完整版权声明

1. 引言

1.1 概述

实时传输协议(RTP)为实时应用提供端到端的网络传输功能,适用于组播或单播网络服务。RTP不保证服务质量,但通过与实时控制协议(RTCP)配合使用,可以监控数据传输质量,并提供流同步和参与者标识等机制。

1.2 协议特点

RTP的关键特性包括:

  • 载荷类型标识:标识载荷的编码格式
  • 序列号:检测丢包和恢复数据顺序
  • 时间戳:支持接收端的定时和同步
  • 源标识:支持多个数据源
  • 监控功能:通过RTCP提供服务质量反馈

1.3 与其他协议的关系

RTP通常运行在UDP之上,也可以与其他适当的网络或传输协议一起使用。RTP不假设底层网络是否可靠,也不保证按序传输。


2. 术语

2.1 基本术语

  • RTP会话:一组参与者通过RTP通信
  • RTP流:单个源的RTP数据包序列
  • 同步源(SSRC):RTP包流的源,由32位标识符标识
  • 贡献源(CSRC):对混合流有贡献的源
  • RTP数据包:通过RTP传输的数据包
  • RTCP数据包:控制信息的数据包
  • 参与者:参与RTP会话的应用或终端
  • 轮廓:一组规则,定义了特定应用如何使用RTP

2.2 协议术语

  • 载荷:RTP包中的实际数据
  • 载荷格式:载荷数据的编码方式
  • 时间戳:载荷采样时刻的时间表示
  • 序列号:包在流中的位置标识
  • 抖动:包到达时间的变化
  • 往返时间:信号从发送到返回的时间

3. RTP使用场景

3.1 简单多播音频会议

参与者1 (SSRC=1) ↓ RTP音频流 混合器 (SSRC=100) ↓ 混合流 所有参与者 (SSRC=100) ↑ RTCP报告

3.2 音频和视频会议

音频流 (SSRC=1) 视频流 (SSRC=2) ↓ ↓ 混合器 转换器 ↓ ↓ 参与者1 参与者2 ↑ ↑ RTCP音频报告 RTCP视频报告

3.3 混合器和转换器

  • 混合器:接收多个流,混合后产生新流
  • 转换器:改变流的编码格式但不混合
  • RTP级中继器:转发包而不修改SSRC

4. 定义

4.1 RTP数据包格式

/* * RTP固定头格式(12字节) */typedefstruct{unsignedintversion:2;/* 协议版本 */unsignedintpadding:1;/* 填充标志 */unsignedintextension:1;/* 扩展标志 */unsignedintcsrc_count:4;/* CSRC计数 */unsignedintmarker:1;/* 标记位 */unsignedintpayload_type:7;/* 载荷类型 */uint16_tsequence_number;/* 序列号 */uint32_ttimestamp;/* 时间戳 */uint32_tssrc;/* 同步源标识符 */uint32_tcsrc[15];/* 贡献源列表(可选) */}rtp_header_t;

4.2 RTP载荷类型

PT编码名称时钟频率声道数
0PCMU (G.711 mu-law)80001
3GSM80001
4G72380001
5DVI4 (8 kHz)80001
6DVI4 (16 kHz)160001
7LPC80001
8PCMA (G.711 A-law)80001
9G72280001
10L16 (立体声)441002
11L16 (单声道)441001
14MPA (MPEG音频)900001
26JPEG900001
31H261900001
32MPV (MPEG视频)900001
33MP2T900001
34H263900001

注:动态载荷类型(96-127)由应用定义


5. 字节序、对齐和时间格式

5.1 字节序

所有整数字段按**网络字节序(大端序)**传输:

  • 16位字段:高位字节在前
  • 32位字段:高位字节在前

5.2 对齐

RTP数据包头在32位边界上对齐,以提高处理效率。

5.3 时间格式

时间戳表示采样时刻,单位由载荷类型决定:

  • 音频:采样周期(如1/8000秒)
  • 视频:帧周期(如1/90000秒)

时间戳的初始值是随机的,增加速率与采样时钟同步。


6. RTP数据传输协议

6.1 RTP固定头字段详解

6.1.1 版本(V)
  • 2位,当前版本为2(二进制10)
6.1.2 填充(P)
  • 1位,指示包尾是否有填充字节
  • 填充字节的最后一个字节包含填充字节数
6.1.3 扩展(X)
  • 1位,指示固定头后是否有扩展头
6.1.4 CSRC计数(CC)
  • 4位,指示CSRC标识符的数量(0-15)
6.1.5 标记(M)
  • 1位,载荷类型相关,如视频帧边界
6.1.6 载荷类型(PT)
  • 7位,标识载荷格式(见4.2节)
6.1.7 序列号
  • 16位,每发送一个RTP包增加1
  • 初始值随机选择,用于检测丢包
6.1.8 时间戳
  • 32位,反映采样时刻
  • 时钟频率取决于载荷格式
  • 用于同步和抖动计算
6.1.9 SSRC
  • 32位,同步源标识符
  • 全局唯一(在单个RTP会话内)
  • 随机选择,冲突概率低
6.1.10 CSRC列表
  • 0-15个32位标识符
  • 标识对混合流有贡献的源

6.2 RTP扩展头

/* * RTP扩展头格式 */typedefstruct{uint16_tprofile;/* 扩展标识符 */uint16_tlength;/* 扩展数据长度(32位字) */uint32_tdata[0];/* 扩展数据 */}rtp_extension_t;

6.3 RTP载荷格式要求

  1. 载荷格式规范必须定义:

    • 载荷类型到编码名称的映射
    • 时间戳时钟频率
    • 打包规则
  2. 视频载荷通常包含:

    • 帧边界信息(使用M位)
    • 时间戳增量规则
  3. 音频载荷通常包含:

    • 采样时钟频率
    • 打包持续时间

6.4 RTP传输要求

  1. 底层协议:通常使用UDP
  2. 端口分配:RTP使用偶数端口,RTCP使用下一个奇数端口
  3. MTU考虑:应避免IP分片
  4. 服务质量:可以结合DiffServ、RSVP等

6.5 混合器处理规则

混合器必须:

  1. 生成新的SSRC标识符
  2. 维护CSRC列表
  3. 调整时间戳和序列号
  4. 可能重新打包载荷

6.6 转换器处理规则

转换器必须:

  1. 保持SSRC不变
  2. 更新载荷类型
  3. 适当调整时间戳
  4. 可能需要缓冲和重新定时

7. RTP控制协议(RTCP)

7.1 RTCP包格式

所有RTCP包以固定头开始:

/* * RTCP公共头格式 */typedefstruct{unsignedintversion:2;/* 协议版本,始终为2 */unsignedintpadding:1;/* 填充标志 */unsignedintcount:5;/* 变体,取决于包类型 */uint8_tpacket_type;/* RTCP包类型 */uint16_tlength;/* 包长度(32位字减1) */}rtcp_common_header_t;

7.2 RTCP包类型

类型缩写名称用途
200SR发送方报告发送方传输和接收统计
201RR接收方报告接收方接收统计
202SDES源描述项源描述信息(CNAME、NAME等)
203BYE再见结束参与通知
204APP应用定义应用特定功能
205RTPFBRTP反馈通用RTP反馈消息(RFC 4585)
206PSFB载荷特定反馈载荷特定反馈消息(RFC 4585)

7.3 发送方报告(SR)格式

/* * RTCP发送方报告(SR)格式 */typedefstruct{rtcp_common_header_theader;/* 类型=200,count=报告块数 */uint32_tssrc;/* 发送方SSRC */uint32_tntp_sec;/* NTP时间戳 - 秒 */uint32_tntp_frac;/* NTP时间戳 - 小数部分 */uint32_trtp_timestamp;/* RTP时间戳 */uint32_tpacket_count;/* 发送的RTP包数 */uint32_toctet_count;/* 发送的字节数 *//* 零个或多个接收报告块 */struct{uint32_tssrc;/* 源的SSRC */uint8_tfraction_lost;/* 自上次SR以来的丢包比例 */int32_tpackets_lost;/* 累计丢包数 */uint32_thighest_seq;/* 接收到的最高序列号 */uint32_tjitter;/* 抖动估计 */uint32_tlsr;/* 最后SR时间戳 */uint32_tdlsr;/* 最后SR延迟 */}report_blocks[31];}rtcp_sr_t;

7.4 接收方报告(RR)格式

/* * RTCP接收方报告(RR)格式 */typedefstruct{rtcp_common_header_theader;/* 类型=201,count=报告块数 */uint32_tssrc;/* 接收方SSRC *//* 零个或多个接收报告块 */struct{uint32_tssrc;/* 源的SSRC */uint8_tfraction_lost;/* 丢包比例 */int32_tpackets_lost;/* 累计丢包数 */uint32_thighest_seq;/* 接收到的最高序列号 */uint32_tjitter;/* 抖动估计 */uint32_tlsr;/* 最后SR时间戳 */uint32_tdlsr;/* 最后SR延迟 */}report_blocks[31];}rtcp_rr_t;

7.5 SDES包格式

/* * RTCP源描述(SDES)格式 */typedefstruct{rtcp_common_header_theader;/* 类型=202,count=源数 */struct{uint32_tssrc;/* 源SSRC *//* SDES项列表(以零项结束) */struct{uint8_ttype;/* SDES项类型 */uint8_tlength;/* 文本长度 */chartext[0];/* 文本内容 */}items[0];}chunks[31];}rtcp_sdes_t;

SDES项类型

  • 1: CNAME(规范名称)- 必须
  • 2: NAME(用户名称)- 可选
  • 3: EMAIL(电子邮件)- 可选
  • 4: PHONE(电话号码)- 可选
  • 5: LOC(地理位置)- 可选
  • 6: TOOL(应用/工具)- 可选
  • 7: NOTE(状态通知)- 可选
  • 8: PRIV(私有扩展)- 可选

7.6 BYE包格式

/* * RTCP再见(BYE)格式 */typedefstruct{rtcp_common_header_theader;/* 类型=203,count=源数 */uint32_tssrc[31];/* 退出的源SSRC列表 */charreason[0];/* 可选的原因字符串 */}rtcp_bye_t;

7.7 APP包格式

/* * RTCP应用定义(APP)格式 */typedefstruct{rtcp_common_header_theader;/* 类型=204,count=子类型 */uint32_tssrc;/* 源SSRC */charname[4];/* 应用名称(4个ASCII字符) */chardata[0];/* 应用相关数据 */}rtcp_app_t;

7.8 RTCP传输间隔

7.8.1 计算规则

RTCP包应定期发送,间隔根据以下公式计算:

T = max(T_min, N * C * avg_rtcp_size / bw)

其中:

  • T= 计算出的传输间隔
  • T_min= 最小间隔(推荐5秒)
  • N= 参与者数量
  • C= 带宽参数(见下表)
  • avg_rtcp_size= 平均RTCP包大小
  • bw= 会话带宽
7.8.2 带宽分配
会话带宽发送者比例接收者比例
< 1000 bps100%0%
≥ 1000 bps25%75%
7.8.3 时间随机化

为避免同步,实际间隔应随机化:

actual_T = T * (random() * 0.5 + 0.5)
7.8.4 逆向重新考虑算法

新参与者初始间隔:

T = T_min * (random() * 1.5 + 1)

7.9 SSRC标识符分配与冲突

7.9.1 分配规则
  1. 随机选择:SSRC应为随机32位值
  2. 唯一性:在RTP会话内必须唯一
  3. 冲突检测:通过RTCP监视冲突
7.9.2 冲突处理

检测到冲突时(相同SSRC):

  1. 数据源冲突:发送BYE包,选择新SSRC
  2. 监控冲突:如果来自不同网络地址,保持两者
7.9.3 环路检测

当收到自己发送的包时:

  1. 发送BYE包
  2. 选择新的SSRC
  3. 继续参与会话

7.10 源描述(SDES)信息

7.10.1 CNAME要求

每个参与者必须有CNAME:

  • 唯一标识参与者
  • 跨多个媒体流保持一致
  • 格式建议:user@host
7.10.2 CNAME格式

推荐格式:

CNAME = user "@" host

其中:

  • user= 登录名或其他标识
  • host= 完全限定域名或IP地址

示例:

alice@example.com 192.0.2.1

7.11 RTCP传输要求

7.11.1 复合包

RTCP包应作为复合包发送,顺序为:

  1. SR或RR(必须)
  2. 额外RR(如有)
  3. SDES(包括CNAME)
  4. 其他(BYE、APP等)
7.11.2 大小限制

复合包不应超过路径MTU:

  • IPv4:≤ 1456字节(1500 - 20 - 8 - 16)
  • IPv6:≤ 1232字节(1280 - 40 - 8 - 0)
7.11.3 加密和认证

如果使用安全RTP(SRTP):

  • RTCP包应单独加密
  • 应保持复合包结构

8. RTP转换器和混合器

8.1 混合器操作

混合器接收多个RTP流,混合后产生新流:

输入流1 (SSRC=1) ──┐ 输入流2 (SSRC=2) ──┼→ 混合器 (SSRC=100) → 输出流 (SSRC=100) 输入流3 (SSRC=3) ──┘

混合器必须:

  1. 生成新的SSRC(100)
  2. 在CSRC列表中包含源SSRC(1,2,3)
  3. 调整时间戳到统一时间线
  4. 重新计算序列号

8.2 转换器操作

转换器改变编码格式但不混合流:

输入流 (SSRC=1, PT=0) → 转换器 → 输出流 (SSRC=1, PT=8) (PCMU→PCMA)

转换器必须:

  1. 保持SSRC不变(1)
  2. 更新载荷类型(0→8)
  3. 适当调整时间戳
  4. 可能需要缓冲

8.3 RTCP处理

8.3.1 混合器的RTCP处理

混合器应:

  1. 转发原始发送者的RTCP报告
  2. 生成自己的接收报告
  3. 作为新源发送SR报告
8.3.2 转换器的RTCP处理

转换器应:

  1. 透明转发RTCP包
  2. 不修改SSRC字段
  3. 可能更新时间戳相关字段

9. 分层编码

9.1 基本概念

分层编码将媒体流分为多个层:

  • 基础层:最低质量,必须接收
  • 增强层:提高质量,可选接收

9.2 RTP中的分层编码

使用不同的RTP流传输各层:

基础层 (SSRC=1, PT=96) 增强层1 (SSRC=2, PT=97) 增强层2 (SSRC=3, PT=98)

9.3 同步机制

通过RTCP关联各层:

  • 相同的CNAME标识
  • 时间戳关联
  • 载荷类型指示层次

10. 轮廓和载荷格式规范

10.1 轮廓定义

轮廓是一组规则,定义:

  1. 载荷类型分配:静态或动态
  2. 时间戳时钟频率:音频、视频等
  3. RTP头字段使用:M位含义等
  4. 打包规则:帧边界处理

10.2 音频视频轮廓(AVP)

RTP/AVP(Audio/Video Profile):

  • 静态载荷类型:0-35
  • 动态载荷类型:96-127
  • 默认时钟频率:见4.2节

10.3 载荷格式规范要求

载荷格式规范必须定义:

  1. 编码算法:如H.264、AAC
  2. RTP打包:载荷在包中的组织
  3. 时间戳使用:时钟频率、增量
  4. 标记位使用:帧边界指示
  5. 分片规则:大帧的分片方法

11. 安全

11.1 安全RTP(SRTP)

SRTP提供:

  • 机密性:AES加密
  • 消息认证:HMAC-SHA1
  • 重放保护:序列号检查

11.2 安全考虑

  1. 认证:防止欺骗攻击
  2. 加密:保护隐私
  3. 完整性:防止篡改
  4. 重放保护:防止重放攻击

11.3 密钥管理

推荐使用:

  • MIKEY:多媒体互联网密钥交换
  • SDES:会话描述协议安全描述
  • ZRTP:ZRTP密钥协商协议

12. 拥塞控制

12.1 基本要求

RTP应用必须实施拥塞控制:

  1. 带宽适应:根据网络条件调整速率
  2. 公平性:与其他流公平共享带宽
  3. 响应性:快速响应网络变化

12.2 技术机制

  1. 速率控制:调整编码比特率
  2. 优先级调整:分层编码中丢弃增强层
  3. 帧率调整:降低视频帧率
  4. 分辨率调整:降低视频分辨率

12.3 RTCP反馈

RTCP提供:

  • 丢包率:网络拥塞指示
  • 抖动:网络延迟变化
  • 往返时间:路径延迟

13. 与RFC 1889的区别

RFC 3550替代RFC 1889,主要区别:

13.1 澄清和修正

  1. RTCP间隔计算:澄清了带宽分配
  2. SSRC冲突处理:改进冲突解决算法
  3. CNAME格式:推荐具体格式

13.2 新功能

  1. 分层编码支持:明确支持
  2. 扩展机制:更好的扩展支持
  3. 安全集成:与SRTP集成

13.3 向后兼容

完全向后兼容,但推荐更新实现。


14. 致谢

感谢以下人员的贡献:

  • Van Jacobson(原始设计)
  • Steve Casner(编辑)
  • Ron Frederick(实现)
  • 以及IETF AVT工作组的成员

15. 参考文献

15.1 规范参考文献

[1] Postel, J., “User Datagram Protocol”, STD 6, RFC 768.

[2] Postel, J., “Internet Protocol”, STD 5, RFC 791.

[3] Schulzrinne, H., “RTP Profile for Audio and Video Conferences with Minimal Control”, RFC 3551.

[4] Baugher, M., “The Secure Real-time Transport Protocol (SRTP)”, RFC 3711.

15.2 信息参考文献

[5] Schulzrinne, H., Casner, S., Frederick, R., and V. Jacobson, “RTP: A Transport Protocol for Real-Time Applications”, RFC 3550.

[6] Handley, M., “Session Announcement Protocol”, RFC 2974.

[7] Rosenberg, J., “SIP: Session Initiation Protocol”, RFC 3261.


16. 作者地址

Henning Schulzrinne Dept. of Computer Science Columbia University 1214 Amsterdam Avenue New York, NY 10027 USA Email: schulzrinne@cs.columbia.edu Stephen L. Casner Packet Design 3400 Hillview Avenue Palo Alto, CA 94304 USA Email: casner@acm.org Ron Frederick Blue Coat Systems, Inc. 650 Almanor Avenue Sunnyvale, CA 94085 USA Email: ronf@bluecoat.com Van Jacobson Packet Design 3400 Hillview Avenue Palo Alto, CA 94304 USA Email: van@packetdesign.com

17. 完整版权声明

Copyright © The Internet Society (2003). All Rights Reserved.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.

The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an “AS IS” basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.


附录A:RTP实现示例

A.1 简单音频发送器

#include<stdint.h>#include<netinet/in.h>#defineRTP_VERSION2#defineRTP_PAYLOAD_TYPE_PCMU0#defineAUDIO_SAMPLE_RATE8000typedefstruct{uint8_tversion:2;uint8_tpadding:1;uint8_textension:1;uint8_tcsrc_count:4;uint8_tmarker:1;uint8_tpayload_type:7;uint16_tsequence_number;uint32_ttimestamp;uint32_tssrc;}rtp_header_t;voidsend_rtp_packet(intsockfd,structsockaddr_in*dest,uint16_tseq,uint32_tts,uint32_tssrc,uint8_t*payload,size_tpayload_len){rtp_header_theader;uint8_tpacket[1500];// 填充RTP头header.version=RTP_VERSION;header.padding=0;header.extension=0;header.csrc_count=0;header.marker=0;header.payload_type=RTP_PAYLOAD_TYPE_PCMU;header.sequence_number=htons(seq);header.timestamp=htonl(ts);header.ssrc=htonl(ssrc);// 复制头和数据到包缓冲区memcpy(packet,&header,sizeof(header));memcpy(packet+sizeof(header),payload,payload_len);// 发送包sendto(sockfd,packet,sizeof(header)+payload_len,0,(structsockaddr*)dest,sizeof(*dest));}

A.2 简单音频接收器

voidreceive_rtp_packet(intsockfd){uint8_tbuffer[1500];rtp_header_t*header;ssize_tlen;len=recv(sockfd,buffer,sizeof(buffer),0);if(len<sizeof(rtp_header_t))return;header=(rtp_header_t*)buffer;// 验证版本if(header->version!=RTP_VERSION)return;// 提取字段(网络字节序转换)uint16_tseq=ntohs(header->sequence_number);uint32_tts=ntohl(header->timestamp);uint32_tssrc=ntohl(header->ssrc);uint8_tpayload_type=header->payload_type;// 处理载荷uint8_t*payload=buffer+sizeof(rtp_header_t);size_tpayload_len=len-sizeof(rtp_header_t);// 解码和播放音频play_audio(payload,payload_len,payload_type);}

A.3 RTCP发送方报告生成

typedefstruct{uint8_tversion:2;uint8_tpadding:1;uint8_tcount:5;uint8_tpacket_type;uint16_tlength;}rtcp_common_header_t;typedefstruct{rtcp_common_header_theader;uint32_tssrc;uint32_tntp_sec;uint32_tntp_frac;uint32_trtp_timestamp;uint32_tpacket_count;uint32_toctet_count;}rtcp_sr_t;voidsend_rtcp_sr(intsockfd,structsockaddr_in*dest,uint32_tssrc,uint32_tntp_sec,uint32_tntp_frac,uint32_trtp_ts,uint32_tpkt_count,uint32_toctet_count){rtcp_sr_tsr;// 填充SR包sr.header.version=RTP_VERSION;sr.header.padding=0;sr.header.count=0;// 无报告块sr.header.packet_type=200;// SRsr.header.length=htons((sizeof(sr)/4)-1);sr.ssrc=htonl(ssrc);sr.ntp_sec=htonl(ntp_sec);sr.ntp_frac=htonl(ntp_frac);sr.rtp_timestamp=htonl(rtp_ts);sr.packet_count=htonl(pkt_count);sr.octet_count=htonl(octet_count);sendto(sockfd,&sr,sizeof(sr),0,(structsockaddr*)dest,sizeof(*dest));}

A.4 抖动计算示例

#defineMAX_JITTER_BUFFER1000// 毫秒typedefstruct{uint32_tlast_timestamp;uint32_tlast_arrival;floatjitter;}jitter_calculator_t;voidupdate_jitter(jitter_calculator_t*jc,uint32_ttimestamp,uint32_tarrival_time){if(jc->last_timestamp==0){jc->last_timestamp=timestamp;jc->last_arrival=arrival_time;jc->jitter=0.0;return;}// 计算传输延迟差异int32_td=(arrival_time-jc->last_arrival)-(timestamp-jc->last_timestamp);if(d<0)d=-d;// 使用指数加权移动平均jc->jitter=jc->jitter+(1.0/16.0)*((float)d-jc->jitter);// 更新状态jc->last_timestamp=timestamp;jc->last_arrival=arrival_time;}

附录B:常见问题解答

B.1 RTP与TCP的区别

特性RTPTCP
可靠性不可靠可靠
顺序保证不保证保证
实时性优化实时不优化实时
拥塞控制应用层控制内置控制
用途实时媒体可靠数据传输

B.2 如何选择RTP载荷类型

  1. 静态类型:0-35,标准编码
  2. 动态类型:96-127,通过信令协商
  3. 选择原则
    • 使用标准编码时选静态类型
    • 自定义编码时用动态类型
    • 通过SDP或RTSP协商

B.3 RTP时间戳同步

  1. 音频同步:使用采样时钟
  2. 视频同步:使用帧率时钟
  3. 多流同步
    • 相同CNAME标识相关流
    • RTCP提供NTP时间参考
    • 接收端调整播放时间

B.4 处理网络抖动

  1. 接收缓冲:缓存一定量数据
  2. 播放调整:动态调整播放点
  3. 丢包隐藏:使用前向纠错或插值

B.5 实现建议

  1. SSRC选择:使用高质量的随机数生成器
  2. 时间戳初始化:随机初始值,防止预测
  3. RTCP带宽:不超过会话带宽的5%
  4. 安全考虑:始终考虑使用SRTP

重要说明

  1. 实现合规:应遵循RFC 3551(RTP/AVP轮廓)
  2. 互操作性:测试与其他实现的互操作性
  3. 性能优化:考虑使用硬件加速
  4. 安全更新:关注SRTP相关安全更新

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询