当前位置: 首页 > news >正文

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

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时间戳的映射。
    • 接收端计算播放时序偏差,动态调整缓冲区。

相关文章:

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

RTSP场景下RTP协议详解及音视频打包全流程 一、RTSP与RTP的关系 RTSP&#xff1a;负责媒体会话控制&#xff08;DESCRIBE、SETUP、PLAY、PAUSE&#xff09;&#xff0c;通过SDP协商传输参数&#xff08;端口、编码格式、封装模式&#xff09;。RTP&#xff1a;实际传输音视频数…...

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务

文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…...

开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

总线直流电机扩展板 原文链接&#xff1a; FreakStudio的博客 摘要 设计了一个I2C电机驱动板&#xff0c;通过I2C接口控制多个电机的转速和方向&#xff0c;支持刹车和减速功能。可连接16个扩展板&#xff0c;具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…...

FFmpeg+WebSocket+JsMpeg实时视频流实现方案

之前写的使用FFmpeg Nginx HLS流媒体播放方案&#xff0c;适合对实时性要求不高的需求&#xff0c;存在延迟&#xff0c;FFmpeg需要将视频流存储到本地文件&#xff0c;而本次方案FFmpeg不需要将视频流存储到本地文件&#xff0c;而是直接将转换后的视频流&#xff08;如MJPE…...

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…...

排序与算法:插入排序

执行效果 插入排序的执行效果是这样的&#xff1a; 呃……看不懂吗&#xff1f;没关系&#xff0c;接着往下看介绍 算法介绍 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c…...

HashMap 详解

一、核心特性 HashMap集合的key是无序不可重复的。 ①无序&#xff1a;插入顺序和取出顺序不一定相同。 ②不可重复&#xff1a;key具有唯一性。 向HashMap集合中put时&#xff0c;key如果重复的话&#xff0c;value会覆盖。 二、HashMap集合的key具有唯一性&#xff0c;向ke…...

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法&#xff1a;rustup update stable...

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …...

uniapp中引入Vant Weapp的保姆级教学(包含错误处理)

废话不多说&#xff0c;直接上方法&#xff0c;网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端&#xff0c;输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹&#xff0c;与app.…...

【Python爬虫(20)】解锁Python爬虫数据存储秘籍:文件存储全攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

关于Unity的一些基础知识点汇总

1.Prefab实例化后&#xff0c;哪些资源是共用的&#xff1f;哪些资源是拷贝的&#xff1f; 共用资源 脚本组件&#xff1a;实例化后的 Prefab 共享脚本组件的代码。若脚本中无状态数据&#xff0c;多个实例对脚本方法的调用会有相同逻辑。比如一个控制物体移动的脚本&#xff0…...

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…...

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…...

solidity之Foundry安装配置(一)

一门面向合约的高级编程语言&#xff0c;主要用来编写以太坊只能合约。 Solidity受C语言&#xff0c;Python和js影响&#xff0c;但为编译成为以太坊虚拟机字节码在EVM上执行&#xff0c;很多特性和限制都和EVM相关。 Solidity 是静态类型语言&#xff0c;支持继承、库、自定义…...

请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?

vue生命周期钩子详解&#xff08;Vue 3版本&#xff09; 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段&#xff0c;每个阶段对应特定钩子函数&#xff1a; 创建阶段&#xff1a;初始化实例并准备数据挂载阶段&#xff1a;将虚拟DOM渲染为真实DOM更新阶段&#xff…...

C#上位机--选择语句(switch)

在 C# 上位机开发的广阔领域中&#xff0c;流程控制语句如同程序的 “交通枢纽”&#xff0c;精准地引导着程序的执行路径。继深入探讨if语句后&#xff0c;我们将目光聚焦于另一个重要的流程控制语句 ——switch语句。switch语句以其独特的多路分支结构&#xff0c;为处理多条…...

万象视界灵坛一文详解:像素风UI如何降低多模态分析认知负荷

万象视界灵坛一文详解&#xff1a;像素风UI如何降低多模态分析认知负荷 1. 多模态分析的认知挑战 现代多模态分析系统面临一个核心矛盾&#xff1a;技术越强大&#xff0c;界面往往越复杂。传统视觉识别平台通常采用专业术语密集的仪表盘和数据表格&#xff0c;这种设计虽然精…...

从PyCharm到命令行:YOLOv8目标检测验证的两种姿势(附结果保存路径详解)

从PyCharm到命令行&#xff1a;YOLOv8目标检测验证的两种姿势&#xff08;附结果保存路径详解&#xff09; 在计算机视觉领域&#xff0c;YOLOv8作为当前最先进的目标检测算法之一&#xff0c;以其卓越的速度和精度赢得了开发者的青睐。然而&#xff0c;对于刚接触YOLOv8的开发…...

LakeFS实战:从零构建数据湖Git工作流,解锁高效数据版本管理

1. 为什么数据湖需要版本控制&#xff1f; 想象一下这样的场景&#xff1a;你的团队正在处理一个关键的数据分析项目&#xff0c;突然有人误删了重要数据集&#xff0c;或者某个实验性修改导致下游报表全部出错。这时候如果没有版本控制&#xff0c;就像程序员没有Git一样——只…...

别只看主频!全志T3(A40I)和T5(T507)在智能车载与工业HMI场景下的真实表现差异

全志T3与T5芯片在智能车载与工业HMI中的实战选型指南 当工程师面对智能车载中控和工业人机界面(HMI)这两类截然不同的应用场景时&#xff0c;芯片选型往往成为决定产品成败的关键。全志T3(A40I)和T5(T507)作为两款定位不同的处理器&#xff0c;在实际应用中展现出的差异远比参数…...

Godot游戏资源提取:3分钟学会PCK文件解包技巧

Godot游戏资源提取&#xff1a;3分钟学会PCK文件解包技巧 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 你是否玩过Godot引擎开发的游戏&#xff0c;被里面的精美素材吸引却无法获取&#xff1f;Go…...

Qt 6.5实战:用QMediaPlayer和QVideoWidget快速打造一个带界面的本地视频播放器

Qt 6.5实战&#xff1a;10分钟构建带UI的本地视频播放器 在当今多媒体应用泛滥的时代&#xff0c;快速开发一个功能完备的视频播放器仍然是许多C开发者的常见需求。Qt 6.5作为跨平台GUI框架的最新版本&#xff0c;其多媒体模块提供了令人惊艳的开发效率。本文将带你跳过冗长的理…...

【2026内存安全编码白皮书】:C语言开发者必须立即落地的7项零成本接入策略

第一章&#xff1a;现代 C 语言内存安全编码规范 2026 如何实现快速接入现代 C 语言内存安全编码规范 2026&#xff08;简称 MSC-2026&#xff09;是一套面向工业级嵌入式与系统软件的轻量级、可增量集成的内存安全实践集合&#xff0c;聚焦于编译时约束、运行时防护与静态分析…...

RAG检索:别再只盯着大模型了!揭秘决定RAG上限的检索策略(附完整链路解析)

在RAG系统中&#xff0c;检索系统的重要性往往被忽视。文章指出&#xff0c;RAG的上限通常由检索系统决定&#xff0c;而非生成模型。检索的核心在于为模型提供真正有证据力的信息。文章详细解析了RAG检索策略的完整链路&#xff0c;包括查询理解与改写、约束提取、稀疏/稠密混…...

【VSCode 2026嵌入式调试插件开发权威指南】:20年一线嵌入式架构师亲授,覆盖ARM/RISC-V双平台实战(含内核级断点注入技术)

https://intelliparadigm.com 第一章&#xff1a;VSCode 2026嵌入式调试插件开发概览 VSCode 2026 引入了全新的调试扩展框架&#xff08;Debug Adapter Protocol v3.2&#xff09;&#xff0c;专为异构嵌入式目标&#xff08;如 RISC-V、ARM Cortex-M85、CH32V407&#xff09…...

智慧树自动刷课插件:告别手动操作,5分钟实现高效学习

智慧树自动刷课插件&#xff1a;告别手动操作&#xff0c;5分钟实现高效学习 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的网课学习而烦恼吗&…...