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:实际传输音视频数…...
使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务
文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…...
开源一款I2C电机驱动扩展板-FreakStudio多米诺系列
总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能。可连接16个扩展板,具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…...
FFmpeg+WebSocket+JsMpeg实时视频流实现方案
之前写的使用FFmpeg Nginx HLS流媒体播放方案,适合对实时性要求不高的需求,存在延迟,FFmpeg需要将视频流存储到本地文件,而本次方案FFmpeg不需要将视频流存储到本地文件,而是直接将转换后的视频流(如MJPE…...
【Linux】Linux 文件系统—— 探讨软链接(symbolic link)
ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆 前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢…...
排序与算法:插入排序
执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,…...
HashMap 详解
一、核心特性 HashMap集合的key是无序不可重复的。 ①无序:插入顺序和取出顺序不一定相同。 ②不可重复:key具有唯一性。 向HashMap集合中put时,key如果重复的话,value会覆盖。 二、HashMap集合的key具有唯一性,向ke…...
DAY07 Collection、Iterator、泛型、数据结构
学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…...
计算机网络之物理层——基于《计算机网络》谢希仁第八版
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
简讯:Rust 2024 edition and v1.85.0 已发布
详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法:rustup update stable...
DeepSeek写俄罗斯方块手机小游戏
DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件: 核心功能要求 原生JavaScript实现,适配手机屏幕 …...
uniapp中引入Vant Weapp的保姆级教学(包含错误处理)
废话不多说,直接上方法,网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端,输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹,与app.…...
【Python爬虫(20)】解锁Python爬虫数据存储秘籍:文件存储全攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
关于Unity的一些基础知识点汇总
1.Prefab实例化后,哪些资源是共用的?哪些资源是拷贝的? 共用资源 脚本组件:实例化后的 Prefab 共享脚本组件的代码。若脚本中无状态数据,多个实例对脚本方法的调用会有相同逻辑。比如一个控制物体移动的脚本࿰…...
SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...
功能说明并准备静态结构
功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码:</span><el-input clearable placeho…...
solidity之Foundry安装配置(一)
一门面向合约的高级编程语言,主要用来编写以太坊只能合约。 Solidity受C语言,Python和js影响,但为编译成为以太坊虚拟机字节码在EVM上执行,很多特性和限制都和EVM相关。 Solidity 是静态类型语言,支持继承、库、自定义…...
请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?
vue生命周期钩子详解(Vue 3版本) 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段,每个阶段对应特定钩子函数: 创建阶段:初始化实例并准备数据挂载阶段:将虚拟DOM渲染为真实DOM更新阶段ÿ…...
C#上位机--选择语句(switch)
在 C# 上位机开发的广阔领域中,流程控制语句如同程序的 “交通枢纽”,精准地引导着程序的执行路径。继深入探讨if语句后,我们将目光聚焦于另一个重要的流程控制语句 ——switch语句。switch语句以其独特的多路分支结构,为处理多条…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
