RTSP场景下RTP协议详解及音视频打包全流程
RTSP场景下RTP协议详解及音视频打包全流程
一、RTSP与RTP的关系
- RTSP:负责媒体会话控制(
DESCRIBE、SETUP、PLAY、PAUSE),通过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 Number | 16 bits | 包序列号,每发送一个RTP包自增1(用于检测丢包和乱序)。 |
| Timestamp | 32 bits | 时间戳,基于编码时钟频率:<br>- 视频:90000 Hz(每帧增量=90000/fps)<br>- 音频:按采样率(如AAC=44100 Hz)。 |
| SSRC | 32 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 Indicator:
F|NRI|Type=28(0x7C)。 -
FU Header:
S|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数据
五、音视频同步机制
- 时间戳对齐:
- 音频时间戳增量 = 采样数(如AAC每帧1024样本 → 增量=1024)。
- 视频时间戳增量 = 90000 / 帧率(如30fps → 增量=3000)。
- RTCP同步:
- 发送端通过SR包传递NTP时间与RTP时间戳的映射。
- 接收端计算播放时序偏差,动态调整缓冲区。
相关文章:
RTSP场景下RTP协议详解及音视频打包全流程
RTSP场景下RTP协议详解及音视频打包全流程 一、RTSP与RTP的关系 RTSP:负责媒体会话控制(DESCRIBE、SETUP、PLAY、PAUSE),通过SDP协商传输参数(端口、编码格式、封装模式)。RTP:实际传输音视频数…...
关于Transparent native-to-ascii conversion
1、功能 自动转换ASCII编码,即在文件系统上,文件的编码格式为ascii编码,在编辑器(idea/pycharm)中,其展现结果为配置的编码格式,仅展现方便阅读 使用UTF-8并勾选自动转换ASCII编码结果&#x…...
万字长文解析:深入理解服务端渲染(SSR)架构与全栈实践指南
一、SSR核心原理深度剖析 1.1 技术定义与演进历程 服务端渲染(Server-Side Rendering)指在服务器端完成页面DOM构建的技术方案。其发展历程可分为三个阶段: 阶段时期典型技术传统SSR2000-2010JSP/PHP现代SSR2015-2020Next.js/Nuxt.js混合渲…...
Spring事务原理 二
在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…...
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下,Space 名称中需要包含 MindSearch 关键词,请在必要的步骤以及成功的对话测试结果当中 实现过程如下: 2.1 MindSearch 简…...
MyBatis Plus扩展功能
一、代码生成器 二、逻辑删除 三、枚举处理器 像状态字段我们一般会定义一个枚举,做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型,对应的PO也是Integer。因此业务操作时必须手动把枚举与Integer转换,非常麻烦。 …...
深度学习之自然语言处理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中,方法是类(或对象)的行为或功能的实现。(一起实现一个功能)java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…...
基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)
第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...
解析CV/多模态算法的要点及技术特点,弥补单模态信息不足的多模态应用的哪些场景中?
CV(计算机视觉)多模态算法是计算机科学领域的重要研究方向,融合了多种模态的数据来提升对视觉信息的理解和处理能力。 以下是一个结合自动驾驶行业的多模态大模型算法示例,采用特征级融合策略,结合摄像头图像和激光雷…...
[漏洞篇]文件上传漏洞详解
[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后…...
11.Docker 之分布式仓库 Harbor
Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例…...
Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)
------★Python练手项目源码★------- Python项目32:订单销售额管理系统1.0(TkinterCSV) Python项目31:初学者也能看懂的聊天机器人1.0源码(命令行界面Re正则表达式) Python项目源码30:待办事…...
使用Termux将安卓手机变成随身AI服务器(page assist连接)
通过以下方法在安卓手机上运行 Ollama 及大模型,无需 Root 权限,具体方案如下: 通过 Termux 模拟 Linux 环境运行 核心工具: 安装 (安卓终端模拟器)()]。借助 proot-distro 工具安装 Linux 发行版…...
SpringBoot3中跨域问题解决
问题 SpringBoot3 中处理跨域请求 异常 浏览器在 localhost:3000 地址请求后端 http://127.0.0.1:8080 时, 报错提示 CORS 问题. 默认使用 Get 请求正常, 其他会提示. 使用 SpringBoot 3.4.2 版本配合 SpringSecurity 配置 Access to fetch at http://127.0.0.1:8080/todo-…...
kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题
一、问题描述和分析 结构体的字段的属性为静态, 意味着该类的所有对象共享同一个属性,所以尽管集合里存的是不同的对象,但是对象的属性还是同一个值 修改其中任何一个,其他的也会“被修改”。使用kotlin语言时候,经常…...
力扣-回溯-51 N皇后
思路 在棋盘上放皇后在回溯方法的树上来说,深度就是每一行放的皇后,宽度就是for循环里遍历放皇后,还有个问题是需要判断当前位置是否允许放皇后 代码 class Solution { public:vector< vector<string> > result;vector<str…...
flink-cdc同步数据到doris中
1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题,因为后面发现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的博文:VSCode上的Git使用手记(持续更新ing…) 现在随着开发经历增加,感觉用到命令行之类复杂功能的机会越来越多了,所以我专门再写一篇Git命令行的文章。 G…...
DeepSeek R1/V3满血版——在线体验与API调用
前言:在人工智能的大模型发展进程中,每一次新模型的亮相都宛如一颗投入湖面的石子,激起层层波澜。如今,DeepSeek R1/V3 满血版强势登场,为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...
关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
1. 问题描述 BK3633 SDK 版本:BK3633_DesignKit_V06_2310 使用 BK3633 UART2 与指纹模块进行通讯,为了降低功耗,通过 GPIO 控制了指纹模块的供电电源。但每次给整个系统板子上电时,BK3633 很大概率会实际而无法正常运行程序&…...
Redis7——基础篇(六)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
简单工厂模式(Simple Factory Pattern)虽然不属于 GoF 23 种经典设计模式,但在实际开发中非常常用,尤其是在 Spring Boot 项目中。它提供了一种简单的方式来创建对象,将对象的创建逻辑集中到一个工厂类中。 一、简单工…...
Python简单使用MinerU
Python简单使用MinerU 1 简介 MinerU是国产的一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。目前支持图像(.jpg及.png)、PDF、Word(.doc及.docx)、以及P…...
使用AI创建流程图和图表的 3 种简单方法
你可能已经尝试过使用 LLMs 生成图像,但你有没有想过用它们来创建 流程图和图表?这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常,在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗?你可以使用 LLMs 通过简…...
ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘
错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...
机器学习实战(7):聚类算法——发现数据中的隐藏模式
第7集:聚类算法——发现数据中的隐藏模式 在机器学习中,聚类(Clustering) 是一种无监督学习方法,用于发现数据中的隐藏模式或分组。与分类任务不同,聚类不需要标签,而是根据数据的相似性将其划…...
z-score算法
z-score算法原理参考网址 https://blog.csdn.net/m0_59596937/article/details/128378641 具体实现代码如下: import numpy as npclass ZScoreOutlierDetector:def __init__(self, threshold3):"""构造函数"""self.threshold thre…...
