RTSP场景下RTP协议详解及音视频打包全流程

news2025/2/23 23:03:03

RTSP场景下RTP协议详解及音视频打包全流程


一、RTSP与RTP的关系
  • RTSP:负责媒体会话控制(DESCRIBESETUPPLAYPAUSE),通过SDP协商传输参数(端口、编码格式、封装模式)。
  • RTP:实际传输音视频数据,基于UDP/TCP,与RTCP配合实现同步和网络状态反馈。

二、RTP头字段详解(RFC 3550)

RTP头固定12字节,字段含义及填写规则如下:

字段名位宽取值说明
Version (V)2 bits固定为2(0x80),表示RTP版本。
Padding §1 bit载荷末尾是否有填充字节(如加密对齐)。RTSP场景通常为0
Extension (X)1 bit是否启用头部扩展(如RFC 5285定义)。默认0,启用时需在SDP中声明。
CSRC Count (CC)4 bits贡献源(CSRC)数量。单路流通常为0
Marker (M)1 bit关键帧结束标记:视频的最后一个分片包设为1;音频包通常为0。
Payload Type (PT)7 bits载荷类型,SDP中动态映射(如96=H.264, 97=H.265, 8=PCMA, 14=MPEG Audio)。
Sequence Number16 bits包序列号,每发送一个RTP包自增1(用于检测丢包和乱序)。
Timestamp32 bits时间戳,基于编码时钟频率:<br>- 视频:90000 Hz(每帧增量=90000/fps)<br>- 音频:按采样率(如AAC=44100 Hz)。
SSRC32 bits同步源标识符,随机生成,同一流中唯一。

示例:H.264视频包头(时间戳增量=3000,30fps):

80 60 00 01   // V=2, P=0, X=0, CC=0, M=0, PT=96 (H.264)
00 01          // Sequence Number = 1
00 00 0B B8    // Timestamp = 3000
DE AD BE EF    // SSRC=0xDEADBEEF

三、视频打包实现
1. H.264视频打包(RFC 6184)
  • NALU结构
  +---------------+---------------+
  |F|NRI| Type    | Payload Data  |
  +---------------+---------------+
  • 封装模式:由SDP参数packetization-mode定义。
    • Mode 0(单NALU) :直接封装小NALU(如SPS/PPS)。
    RTP头 | NALU头(1B) | 数据
  • Mode 1(FU-A分片) :大NALU分片传输,添加FU头和标记位。
    RTP头 | FU Indicator(1B) | FU Header(1B) | 分片数据
  • FU IndicatorF|NRI|Type=28(0x7C)。

  • FU HeaderS|E|R|Type(S/E标志分片起止,Type为原始NALU类型)。

    • Mode 2(STAP-A组合) :聚合多个小NALU。
    RTP头 | STAP头(1B) | NALU1长度(2B) | NALU1数据 | NALU2长度(2B) | NALU2数据
  • 关键帧分片示例
  // 第一个分片
  RTP头(M=0) | 0x7C | 0x85(S=1, Type=5) | 分片数据

  // 最后一个分片
  RTP头(M=1) | 0x7C | 0x45(E=1, Type=5) | 分片数据
2. H.265视频打包(RFC 7798)
  • NALU头扩展:2字节,包含层次标识(LayerID)和时域层级(TID)。
  +---------------+---------------+---------------+
  |F| Type(6b) | LayerID(6b) | TID(3b)     |
  +---------------+---------------+---------------+
  • 分片模式(FU-A)
  RTP头 | FU Indicator(2B) | FU Header(1B) | 分片数据
  • FU Indicator:Type=49(0x62)。

  • FU Header:同H.264的S/E标志,Type为原始NALU类型(如32=IDR)。

  • 示例

  // 第一个分片
  RTP头 | 0x62 0x80(LayerID=0, TID=1) | 0x80(S=1, Type=32) | 分片数据
3. SDP配置示例
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0LAH9kAUAW6EAAAAwAQAAADA8PFRQ=,aM48gA==

四、音频打包实现
1. G.711(PCMU/PCMA)
  • 静态PT:0(PCMU)、8(PCMA)。
  • 封装:直接填充裸数据,时间戳按样本数递增。
  RTP头(PT=0/8) | 音频样本(每样本1字节)
2. AAC(RFC 3640)
  • 动态PT:通过SDP协商(如96)。
  • 封装:添加AU头声明数据长度。
  RTP头 | AU头长度(2b) | AU头(16b长度) | AAC数据
3. Opus(RFC 7587)
  • 封装:直接填充Opus帧,支持分片。
  RTP头 | TOC字段(配置参数) | Opus数据

五、音视频同步机制
  1. 时间戳对齐
    • 音频时间戳增量 = 采样数(如AAC每帧1024样本 → 增量=1024)。
    • 视频时间戳增量 = 90000 / 帧率(如30fps → 增量=3000)。
  2. RTCP同步
    • 发送端通过SR包传递NTP时间与RTP时间戳的映射。
    • 接收端计算播放时序偏差,动态调整缓冲区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中&#xff0c;我们熟悉了Spring声明式事务的AOP原理&#xff0c;以及事务执行的大体流程。 本文中&#xff0c;介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中&#xff0c;我们将结合案例&#xff0c;来讲解实战中有关事务的易…

SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)

目录 一、引言二、集成ToolContext示例步骤1: 在`@Tool`标注的工具方法中集成`ToolConext`参数步骤2:`ChatClient`运行时动态设置`ToolContext`参数三、填坑一、引言 在使用AI大模型的工具调用机制时,工具参数都是由大模型解析用户输入上下文获取的,由大模型提供参数给本地…

本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6

部署MindSearch到 hugging face Spaces上——L2G6 任务1 在 官方的MindSearch页面 复制Spaces应用到自己的Spaces下&#xff0c;Space 名称中需要包含 MindSearch 关键词&#xff0c;请在必要的步骤以及成功的对话测试结果当中 实现过程如下&#xff1a; 2.1 MindSearch 简…

MyBatis Plus扩展功能

一、代码生成器 二、逻辑删除 三、枚举处理器 像状态字段我们一般会定义一个枚举&#xff0c;做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型&#xff0c;对应的PO也是Integer。因此业务操作时必须手动把枚举与Integer转换&#xff0c;非常麻烦。 …

深度学习之自然语言处理CBOW预测及模型的保存

自然语言处理CBOW预测及模型的保存 目录 自然语言处理CBOW预测及模型的保存1 自然语言处理1.1 概念1.2 词向量1.2.1 one-hot编码1.2.2 词嵌入1.2.3 常见的词嵌入模型 2 CBOW预测模型搭建2.1 数据及模型确定2.1.1 数据2.1.2 CBOW模型2.1.3 词嵌入降维 2.2 数据预处理2.3 模型搭建…

qt项目配置部署

Test项目: 子项目testFileHelper 1.新建一个test项目的子项目:取名testFileHelper 2.编写测试用例 3.pro文件中引入qosbrowser 4.引入测试对象的cpp和头文件 2.在项目中引入资源文件testfile.txt,在其中输入abc 实现thrid目录复用 移动thrid 将thrild目录统一放在章…

java方法学习

java 方法 在Java中&#xff0c;方法是类&#xff08;或对象&#xff09;的行为或功能的实现。&#xff08;一起实现一个功能&#xff09;java的方法类似于其他语言的函数&#xff0c;是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…

基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)

第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示&#xff1a; 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台&#xff0c;所以对信息的安全和稳定要求非常高。为了解决本问题&#xff0c;采用前端…

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 VMware 开源&#xff0c;其通过添加一些企业必需的功能特性&#xff0c;例…

Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)

------★Python练手项目源码★------- Python项目32&#xff1a;订单销售额管理系统1.0&#xff08;TkinterCSV&#xff09; Python项目31&#xff1a;初学者也能看懂的聊天机器人1.0源码&#xff08;命令行界面Re正则表达式&#xff09; Python项目源码30&#xff1a;待办事…

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…

flink-cdc同步数据到doris中

1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题&#xff0c;因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…

Git命令行入门

诸神缄默不语-个人CSDN博文目录 之前写过一篇VSCode Git的博文&#xff1a;VSCode上的Git使用手记&#xff08;持续更新ing…&#xff09; 现在随着开发经历增加&#xff0c;感觉用到命令行之类复杂功能的机会越来越多了&#xff0c;所以我专门再写一篇Git命令行的文章。 G…

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…

关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明

1. 问题描述 BK3633 SDK 版本&#xff1a;BK3633_DesignKit_V06_2310 使用 BK3633 UART2 与指纹模块进行通讯&#xff0c;为了降低功耗&#xff0c;通过 GPIO 控制了指纹模块的供电电源。但每次给整个系统板子上电时&#xff0c;BK3633 很大概率会实际而无法正常运行程序&…

Redis7——基础篇(六)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

使用AI创建流程图和图表的 3 种简单方法

你可能已经尝试过使用 LLMs 生成图像&#xff0c;但你有没有想过用它们来创建 流程图和图表&#xff1f;这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常&#xff0c;在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗&#xff1f;你可以使用 LLMs 通过简…

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集&#xff1a;聚类算法——发现数据中的隐藏模式 在机器学习中&#xff0c;聚类&#xff08;Clustering&#xff09; 是一种无监督学习方法&#xff0c;用于发现数据中的隐藏模式或分组。与分类任务不同&#xff0c;聚类不需要标签&#xff0c;而是根据数据的相似性将其划…

企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow

企业级 RAG GitHub 开源项目深度分享&#xff1a;Quivr、MaxKB、Dify、FastGPT、RagFlow 及私有化 LLM 部署建议 随着生成式 AI 技术的成熟&#xff0c;检索增强生成&#xff08;RAG&#xff09;已成为企业构建智能应用的关键技术。RAG 技术能够有效地将大型语言模型&#xff…