如皋市城乡建设局网站/淘宝推广平台有哪些

如皋市城乡建设局网站,淘宝推广平台有哪些,石家庄网站开发公司,银川市住房城乡建设委官方网站此文为系列文章,此系列主要讲解RTSP客户端的拉流及播放,文章持续更新,会从rtsp的基本协议讲起,如何一步步实现音视频的拉流过程,包括一系列涉及到的协议,rtsp,sdp, rtp(本…

  此文为系列文章,此系列主要讲解RTSP客户端的拉流及播放,文章持续更新,会从rtsp的基本协议讲起,如何一步步实现音视频的拉流过程,包括一系列涉及到的协议,rtsp,sdp, rtp(本系列文章的核心内容会放在rtp协议,会重点介绍讲解rtp负载部分), rtcp, 从rtp解析aac,h264数据帧,得到帧后如何交给解码库(ffmpeg,libVLC,live555等)进行解码,音视频同步并播放音频和视频,如果内容涉及到TCP和UDP网络通信内容,可以参考:

【Linux编程】一个基于 C++ 的 TCP 客户端异步(epoll)框架(一))
【Linux编程】TcpServer 类的设计与实现:构建高性能的 TCP 服务器(二)
【Linux编程】C++ UDP的UdpClient 类详解与网络通信实现(三))


文章目录

  • 1.RTP协议基础
    • 1.1 RTP协议概述
    • 1.2 RTP头部结构
  • 2. RTP负载:音频AAC封装模式
    • 2.1 单帧模式
    • 2.2 多帧模式
    • 2.3. 分片模式
  • 3.RTP负载:音频AAC封装格式
    • 3.1 AU-headers-length
    • 3.2 AU-headers
      • 3.2.1 AU-size
      • 3.2.2 AU-index/AU-index-delta
      • 3.2.3 CTS-flag
      • 3.2.4 CTS-delta
      • 3.2.5 DTS-flag
      • 3.2.6 DTS-delta
      • 3.2.7 RAP-flag
      • 3.2.8 Stream-state
    • 3.3 AAC音频数据
  • 4. ADTS
    • 4.1 AAC与ADTS的关系
    • 4.2 ADTS 结构
      • 4.2.1 ADTS 头部详解


  本篇文章是介绍关于RTSP拉流过程内容,如果涉及到推流协议的了解,请阅读:
基于FFmpeg进行rtsp推流协议分析过程(详细教程)(全息讲解)

1.RTP协议基础

1.1 RTP协议概述

  RTP(Real-time Transport Protocol)是一种用于网络上传输实时数据(如音频、视频等)的协议,广泛应用于流媒体、视频会议、VoIP等场景。RTP协议的核心目标是为实时数据的传输提供时间戳、序列号等信息,以便接收端能够正确地重组数据流,保证数据的实时性和顺序性。RTP协议不保证数据的可靠传输,通常与RTCP(RTP Control Protocol)配合使用,以实现流量控制、拥塞控制等功能。

1.2 RTP头部结构

  RTP头在前面的文章中讲解了,RTP头部是RTP协议的关键组成部分,它包含了多个字段,用于描述RTP数据包的特征和传输状态。RTP头部的结构如下表所示:

在这里插入图片描述

2. RTP负载:音频AAC封装模式

   根据 RFC 3640 的定义,RTP 封装 AAC 数据时主要有以下三种方式:一个 RTP 包携带一个 AU、一个 RTP 包携带多个 AU、一个 RTP 包携带一个 AU 的片段。

2.1 单帧模式

   一个 RTP 数据包中只携带一个完整的 Access Unit(AU),即一个音频帧。 每个 RTP 数据包只包含一个完整的音频帧,不会进行分片。适用于音频帧较小且网络 MTU 足够大的情况。RTP 数据包的 Marker 位(M 位)通常设置为 1,表示这是一个完整的音频帧。

2.2 多帧模式

   一个 RTP 数据包中携带多个完整的 Access Unit(AU),即多个音频帧。 一个 RTP 数据包可以包含多个完整的音频帧,以提高传输效率。每个音频帧的大小可以通过 AU-header 中的 AU-size 字段指定。RTP 数据包的 Marker 位(M 位)通常设置为 1,表示这是最后一个音频帧。

2.3. 分片模式

   一个 RTP 数据包中只携带一个 AU 的一个片段,多个 RTP 数据包共同组成一个完整的 AU。一个 AU 被分割成多个片段,每个片段携带在不同的 RTP 数据包中。所有分片的 RTP 数据包具有相同的时间戳,但序列号不同。最后一个分片的 RTP 数据包的 Marker 位(M 位)设置为 1,表示这是该 AU 的最后一个分片。适用于音频帧较大且网络 MTU 较小的情况,避免因音频帧过大而导致的 IP 碎片化。

3.RTP负载:音频AAC封装格式

3.1 AU-headers-length

   AU-headers-length 是在 RTP 封装 AAC 音频数据时的关键字段。它位于 RTP 载荷的起始位置,紧跟在 RTP 头部之后。该字段的长度固定为 2 字节,其值以 bit 为单位,表示后续所有 AU-header(Audio Unit Header,音频单元头)的总长度。由于每个 AU-header 的长度固定为 16 bit,因此 AU-headers-length 的值总是 16 的倍数。这一特性使得接收端能够快速准确地解析出后续的 AU-header 数量和位置。

   例如,当一个 RTP 包中只包含一个 AU-header 时,AU-headers-length 的值为 16;若包含两个 AU-header,则其值为 32,以此类推。通过这种方式,接收端可以根据 AU-headers-length 的值,轻松计算出后续 AU-header 的数量,即 AU-headers-length 的值除以 16。这种设计不仅提高了数据解析的效率,还确保了数据传输的灵活性,允许一个 RTP 包中可以包含多个音频单元(Audio Unit),从而适应不同的音频编码和传输需求。在实际应用中,AU-headers-length 字段的值对于接收端正确解析 RTP 包中的音频数据至关重要。接收端首先读取该字段的值,确定后续 AU-header 的总长度,进而可以准确地提取出每个 AU-header 的内容。每个 AU-header 包含了音频单元的大小、索引等信息,这些信息对于后续音频数据的解码和播放具有重要意义。因此,AU-headers-length 字段在 RTP 封装 AAC 数据的过程中,起到了桥梁的作用,连接了 RTP 头部和音频数据,确保了数据传输的完整性和准确性。

3.2 AU-headers

   AU-headers(Access Unit Headers)是用于音频编码数据流中的头部信息,主要在音频数据的传输和解析过程中发挥重要作用。在音频编码标准中,AU-headers通常用于标识音频数据的起始位置、长度、时间戳等关键信息,以便接收端能够正确地解析和播放音频流。AU-headers是音频数据流中的一个组成部分,它位于音频帧的前面,用于描述音频帧的相关信息。根据不同的音频编码标准,AU-headers的结构和内容可能会有所不同。例如,在AAC(Advanced Audio Coding)编码中,AU-headers通常包含音频帧的长度、索引等信息,这些信息需要SDP内容来确定。
在此之前放一个SDP示例:

v=0
o=- 0 0 IN IP4 127.0.0.1
s=Stream
c=IN IP4 0.0.0.0
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGf58BagICAoAAAAMAgAAAGQeMGMs=,aO+CPLA=; profile-level-id=640028
a=control:trackID=0
m=audio 0 RTP/AVP 97
a=rtpmap:97 mpeg4-generic/48000/2
a=fmtp:97 profile-level-id=1; mode=AAC-hbr; sizelength=13; indexlength=3; indexdeltalength=3; config=119056e500
a=control:trackID=1

注: SDP来自于RTSP请求信息的DESCRIBE方法。

3.2.1 AU-size

   表示音频帧的长度(以字节为单位)。该字段的长度由SDP(Session Description Protocol)中的sizeLength参数决定,sizeLength的单位为bit。例如,sizeLength = 13,表示AU-size字段占用13位,能够表示的最大音频帧长度为8191字节。这一字段对于接收端正确读取音频帧的大小至关重要。

3.2.2 AU-index/AU-index-delta

   用于标识 序列号。AU-Index 出现在第一个 AU-header 中,而 AU-Index-delta 出现在后续的 AU-header 中,表示相对于前一个 AU 的序列号差值

   AU-index表示音频帧在整个音频流中的序号。该字段的长度由SDP中的indexLength参数决定。在某些情况下,AU-index字段可能用于标识音频帧的顺序,特别是在音频流中包含多个音频帧的情况下。例如,当一个RTP包中包含多个音频帧时,AU-index字段可以帮助接收端对音频帧进行排序和管理。例如,indexlength = 3 时,表示AU-index字段占用3位数据长度。

   AU-index-delta表示音频帧序号的增量。该字段的长度由SDP中的indexDeltaLength参数决定。在某些音频编码标准中,AU-index-delta字段用于表示当前音频帧序号与前一个音频帧序号的差值。这种表示方式可以节省一些空间,特别是在音频帧序号变化较小的情况下。

3.2.3 CTS-flag

   表示是否包含 CTS-delta 字段。值为 1 表示存在 CTS-delta 字段,值为 0 表示不存在,该字段由SDP 中的 CTSDeltaLength 参数定义了 CTS-delta 字段的位数,如果 CTSDeltaLength 为 0或不存在,则表示 CTS-delta 字段不存在。

3.2.4 CTS-delta

   表示 Composition Time Stamp (CTS) 的偏移量,相对于 RTP 头部的时间戳,该字段的存在与否由 CTS-flag 字段决定,而 CTS-flag 的存在与否由 CTSDeltaLength 参数决定。

3.2.5 DTS-flag

   表示是否包含 DTS-delta 字段。值为 1 表示存在 DTS-delta 字段,值为 0 表示不存在, 该字段由SDP 中的 DTSDeltaLength 参数定义了 DTS-delta 字段的位数。如果 DTSDeltaLength 为 0,则表示 DTS-delta 字段不存在。

3.2.6 DTS-delta

   表示 Decoding Time Stamp (DTS) 的偏移量,相对于 CTS,该字段的存在与否由 DTS-flag 字段决定,而 DTS-flag 的存在与否由 DTSDeltaLength 参数决定。

3.2.7 RAP-flag

   表示该 Access Unit 是否为随机访问点。值为 1 表示是随机访问点,值为 0 表示不是,该字段由SDP 中的 randomAccessIndication 参数定义了 RAP-flag 字段的存在与否。值为 1 表示存在 RAP-flag 字段,值为 0 表示不存在。

3.2.8 Stream-state

   表示 MPEG-4 系统流的状态,每个状态由一个模数计数器的值标识。该字段由SDP 中的 streamStateIndication 参数定义了 Stream-state 字段的位数。如果 streamStateIndication 为 0或不存在,则表示 Stream-state 字段不存在。

3.3 AAC音频数据

   之后就是裸的AAC音频压缩流了,RTP负载中封装AAC音频数据主要使用两种格式:ADTS和LATM。ADTS格式较为简单,但封装开销较大,而LATM格式更加高效,适合低延迟和低带宽的实时传输应用。在实际应用中,根据网络带宽、延迟要求和音频质量需求的不同,选择适当的封装格式是关键。但是在封装RTP协议时,需要特别注意的是,在封装AAC音频时,往往去掉了ADTS信息的,解析时得到的是裸的AAC音频压缩流,我们在解码时需要将ADTS还原。

4. ADTS

4.1 AAC与ADTS的关系

   ADTS(Audio Data Transport Stream,音频数据传输流)是AAC音频的一种封装格式,主要用于音频数据的传输。ADTS为每帧AAC音频数据添加了一个头部信息,该头部包含了音频数据的编码参数和帧的长度等信息。
   在实际应用中,AAC音频数据通常被封装在ADTS格式中进行传输。发送端将AAC音频数据编码成ADTS格式,接收端则解析ADTS头部信息,提取AAC音频数据进行解码。这种封装方式使得AAC音频能够在各种网络环境中高效、可靠地传输。

4.2 ADTS 结构

   ADTS(Audio Data Transport Stream)是AAC(Advanced Audio Coding)的一种常见传输流格式,通常用于封装AAC音频数据,使其适合在网络上传输。ADTS帧由两部分组成:

  • ADTS头部(Header):包含音频的采样率、声道数、帧长度等信息。
  • AAC音频数据(Payload):实际的AAC音频编码数据。

4.2.1 ADTS 头部详解

   ADTS头部通常为7个字节(当存在CRC校验时为9个字节)。千字文,不如表格来的直接:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【ARM】JTAG接口介绍

1、 文档目标 对 JTAG 接口有更多的认识,在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时,免不了要接触到 JTAG 接口,当出现连接不上时,就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…

C++-AVL树

一、AVL树的概念 1.二叉搜索树 二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质: 非空左子…

w208基于spring boot物流管理系统设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)

1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种…

神经网络常见激活函数 8-SELU函数

SELU 缩放指数线性单元:SELU(Scaled Exponential Linear Unit) 函数导函数 SELU函数 S E L U ( x ) { λ x x > 0 λ α ( e x − 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

达梦:AWR 生成

目录标题 AWR 性能诊断与报告生成1. 检查 AWR 系统状态2. 查看数据库中的所有表空间3. 查看现有的 AWR 快照4. 设置 AWR 快照的时间间隔5. 创建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 报告8. 将 AWR 报告保存到指定文件链接总结 自动工作集负载信息库 AWR 报告解析指…

【Map vs Set】:Java数据存储的“双子星”对决

个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 🍰一、搜索 🍮1.概念 🍮2.模型 🍰二、Map 🍨1.什么是Map? 🍨2.Map的实例化 &…

【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言 】C语言 桌游开发数字竞拍(源码…

Reinforcement Learning Heats Up 强化学习持续升温

Reinforcement Learning Heats Up 强化学习持续升温 核心观点:强化学习正成为构建具有高级推理能力大语言模型(LLMs)的重要途径。 最新进展 模型示例:近期出现了如DeepSeek - R1及其变体(DeepSeek - R1 - Zero&#xf…

Whisper+T5-translate实现python实时语音翻译

1.首先下载模型,加载模型 import torch import numpy as np import webrtcvad import pyaudio import queue import threading from datetime import datetime from faster_whisper import WhisperModel from transformers import AutoTokenizer, AutoModelForSeq2…

湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构

导读:浙江霖梓早期使用 CDH 产品套件搭建了大数据系统,面临业务逻辑冗余、查询效率低下等问题,基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris Paimon 的实…

Jmeter压测怎么控制TPS

压测固定TPS的接口 有些任务需要我们控制接口的TPS,例如每秒请求一次。 TPS定时器 然后1个并发持续运行 压测结果 需要注意TPS在1.0/s左右,有时可能是1.2、1.3,定时器会自动调整压力,让TPS保持在1.0左右。

信呼OA办公系统sql注入漏洞分析

漏洞描述 信呼OA办公系统uploadAction存在SQL注入漏洞,攻击者可利用该漏洞获取数据库敏感信息。 环境搭建 源码下载地址:https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下,配置好数据库,然后安装即可 默认密…

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…

开关电源实战(一)宽范围DC降压模块MP4560

系列文章目录 文章目录 系列文章目录MP4560MP4560 3.8V 至 55V 的宽输入范围可满足各种降压应用 MOSFET只有250mΩ 输出可调0.8V-52V SW:需要低VF肖特基二极管接地,而且要靠近引脚,高压侧开关的输出。 EN:输入使能,拉低到阈值以下关闭芯片,拉高或浮空启动 COMP:Compens…

微软AutoGen高级功能——Magentic-One

介绍 大家好,博主又来给大家分享知识了,这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢,我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统,用于…

DeepSeek是如何通过“蒸馏”技术打造自己的AI模型

1 引言: 最近,外媒对中国公司——DeepSeek进行了猛烈抨击,指控其采用了所谓的“蒸馏”(Distillation)技术,涉嫌抄袭甚至作弊。那么,什么是“蒸馏”技术? 在人工智能领域,…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点&#xff1a…