openrtp 音视频时间戳问题
解决音视频发送的rtp问题
openrtp增加了音频aac的发送,地址
OpenRTP Gitee开源地址
同时使用两个rtp ,来发送音频和视频
使用以下音频rtp,是可以发送和接收的,音频端口在视频端口上+2
v=0
o=- 0 0 IN IP4 127.0.0.1
s=My Stream
c=IN IP4 0.0.0.0
t=0 0
m=audio 1234 RTP/AVP 97
a=rtpmap:97 mpeg4-generic/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3
音视频合成发送rtp
vlc 使用分开的端口来接收,经过测试无误
v=0
o=- 0 0 IN IP4 127.0.0.1
s=My Stream
c=IN IP4 0.0.0.0
t=0 0
m=audio 6002 RTP/AVP 97
a=rtpmap:97 mpeg4-generic/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3
m=video 6000 RTP/AVP 96
a=rtpmap:96 H264/90000
我把sdp文件放在了这里,


是否使用同一端口发送音视频
一、协议规范
RTP(Real-time Transport Protocol)通常为音频和视频分别分配不同的端口以区分不同类型的媒体流。这样做符合协议设计的常规做法,使得接收端能够明确地识别和处理不同类型的媒体数据。
二、处理复杂性
解码和播放:如果音频和视频使用同一个端口,接收端在处理数据时需要更加复杂的逻辑来区分音频和视频数据包。这增加了处理的难度和出错的可能性,可能导致播放不稳定或不同步。
同步问题:不同的媒体流需要进行同步才能保证良好的播放效果。使用不同的端口可以更容易地实现音频和视频的同步,因为接收端可以独立地处理每个流的时间戳和同步信息。如果使用同一个端口,同步处理会变得更加复杂,可能会影响播放质量。
三、网络传输考虑
带宽管理:音频和视频通常具有不同的带宽需求。分开使用不同的端口可以更好地进行带宽管理和流量控制。例如,可以为视频流分配更多的带宽,以确保高质量的视频播放,而音频流可以使用相对较少的带宽。
网络故障处理:如果音频和视频使用同一个端口,当该端口出现网络问题时,音频和视频都会受到影响。而使用不同的端口可以在一定程度上隔离问题,使得在一个流出现问题时,另一个流可能仍然能够正常传输。
综上所述,为了保证音频和视频的稳定播放、便于处理和同步,以及更好地进行网络管理,建议为音频流和视频流分别使用不同的端口。
以上其实问题都能解决,比如rtmp协议就是一个端口,处理所有音视频,对于rtp协议,如果使用udp,其实可以使用不同的端口来发送视频和音频,这样处理逻辑更为简单,但不是必要。
计算时间戳增量:
音频时间戳
音频时间戳的单位就是采样率的倒数,例如采样率44100,那么1秒就有44100个采样,每个采样1/44ms,每个采样对应一个时间戳。RTP音频包如果是10毫秒的数据,对应的采样数为 44100 * 10 / 1000 = 441,也就是说每个音频包里携带440个左右的音频采样,因为1个采样对应1个时间戳,那么相邻两个音频RTP包的时间戳之差就是960。
那如果是回调函数采集的音频,我们可以计算回调两次之间的时间差t - t0,t0是第一次的时间,这样有可能造成越来越来的累计时间,如果我们知道是采样一次位1024个样本,那样就好计算了
1024 ,每次就是增加1024,缓冲区计算就是1024* channel(声道)* (perbytes)字节,比如16位就是2字节,那就是1024 X 2 X 2 = 4096个字节的缓冲,每次增加1024时间戳就行
nt rtp_pakc_aac(unsigned char *ptr,int bytes,unsigned char *rtpPkt)
{if (0xFF == ptr[0] && 0xF0 == (ptr[1] & 0xF0) && bytes > 7){// skip ADTS headerassert(bytes == (((ptr[3] & 0x03) << 11) | (ptr[4] << 3) | ((ptr[5] >> 5) & 0x07)));ptr += 7;bytes -= 7;}int rtpHeadLen = rtp_pack_header(rtpPkt);//RTP Headerunsigned char * header = rtpPkt + rtpHeadLen;// 3.3.6. High Bit-rate AAC// SDP fmtp: mode=AAC-hbr;sizeLength=13;indexLength=3;indexDeltaLength=3;header[0] = 0;header[1] = 16; // 16-bits AU headers-lengthheader[2] = (uint8_t)(bytes >> 5); header[3] = (uint8_t)(bytes & 0x1f) << 3;//13bit AU-size、3bit AU-Index/AU-Index-deltaunsigned char * pPayload = rtpPkt + rtpHeadLen + 4;memcpy(pPayload, ptr,bytes);return bytes + rtpHeadLen + 4;
从RTP包里面得到AAC音频数据的方法://功能:解RTP AAC音频包,声道和采样频率必须知道。
//参数:1.RTP包缓冲地址 2.RTP包数据大小 3.H264输出地址 4.输出数据大小
//返回:true:表示一帧结束 false:帧未结束 一般AAC音频包比较小,没有分片。
bool UnpackRTPAAC(void * bufIn, int recvLen, void** pBufOut, int* pOutLen)
{unsigned char* bufRecv = (unsigned char*)bufIn;//char strFileName[20];unsigned char ADTS[] = {0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0xFC}; int audioSamprate = 32000;//音频采样率int audioChannel = 2;//音频声道 1或2int audioBit = 16;//16位 固定switch(audioSamprate){case 16000:ADTS[2] = 0x60;break;case 32000:ADTS[2] = 0x54;break;case 44100:ADTS[2] = 0x50;break;case 48000:ADTS[2] = 0x4C;break;case 96000:ADTS[2] = 0x40;break;default:break;}ADTS[3] = (audioChannel==2)?0x80:0x40;int len = recvLen - 16 + 7;len <<= 5;//8bit * 2 - 11 = 5(headerSize 11bit)len |= 0x1F;//5 bit 1 ADTS[4] = len>>8;ADTS[5] = len & 0xFF;*pBufOut = (char*)bufIn+16-7;memcpy(*pBufOut, ADTS, sizeof(ADTS));*pOutLen = recvLen - 16 + 7;unsigned char* bufTmp = (unsigned char*)bufIn;bool bFinishFrame = false;if (bufTmp[1] & 0x80){//DebugTrace::D("Marker");bFinishFrame = true;}else{bFinishFrame = false;}return true;
}
视频时间戳
rtp协议中视频一般以90000为时间基,一帧应该是对应多少次的采集;比如视频20帧,采样率是90KHZ,那么1帧就3600次的采集(90000 / 20 = 4500 ),也就是时间戳每帧每次增加4500个单位。

其他
rtp receive 暂时没有增加音频的接收,仍然是ps流的接收和普通rtp流的接收,rtmp流发送照旧是视频,近期增加音频的同步发送
相关文章:
openrtp 音视频时间戳问题
解决音视频发送的rtp问题 openrtp增加了音频aac的发送,地址 OpenRTP Gitee开源地址 同时使用两个rtp ,来发送音频和视频 使用以下音频rtp,是可以发送和接收的,音频端口在视频端口上2 v0 o- 0 0 IN IP4 127.0.0.1 sMy Stream cI…...
了解Android中为什么需要多线程?
在Android开发中,多线程是一个至关重要的概念。理解并合理应用多线程,可以显著提升应用的性能和用户体验。 一、Android多线程的基本概念 1. 主线程与UI线程 在Android中,主线程也称为UI线程,它负责处理用户输入、事件分发、绘…...
Kaggle Python练习:使用外部库(Exercise: Working with External Libraries)
文章目录 问题1:坐标轴及标签显示问题2:赢得比赛的最佳项目并计数问题3:21点游戏方法1:把超过21点的最后记为0方法2:把超过21点在最后进行判断方法3:官方代码与方法2相似 问题1:坐标轴及标签显示…...
React 子组件调用父组件的方法,以及互相传递数据
<script type"text/babel" data-type"module"> import React, { StrictMode, useState } from react; import { createRoot } from react-dom/client;const ParentComponent () > {const [message, setMessage] useState("")//父组件…...
爬虫基础---python爬虫系列2
爬虫基础 文章目录 爬虫基础爬虫简介爬虫的用途爬虫的合法性规避风险看懂协议反爬机制反反爬策略 认识HTTPHTTP协议--HyperText Transfer ProtocolHTML--HyperText Markup LanguageHTTPS如何查看网站是什么协议呢使用端口号 URL组成部分详解常用的请求- Request Method常见的请…...
jmeter在beanshell中使用props.put()方法的注意事项
在jmeter中,通常使用beanshell去处理一些属性的设置和获取的操作,而这些操作也是有一定的规则的。 1. 设置属性时,在属性名上要加双引号,这代表它不是一个需要用var去声明的变量 这种设置属性的方式才是有效可行的,在…...
息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络
息肉检测数据集 yolov5 yolov8格式 息肉检测数据集介绍 数据集概述 名称:息肉检测数据集(基于某公开的分割数据集调整)用途:适用于目标检测任务,特别是内窥镜图像中的息肉检测格式:YOLO格式(边…...
通过API进行Milvus实例配置
更新Milvus各个组件的配置参数。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 编辑调试 授权信息 下表是API对应的授权信息,可以在RAM权限策略语句的…...
Excelize 开源基础库 2.9.0 版本正式发布
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Excel、WPS、OpenOffice 等办公软件创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式…...
人脸识别-特征算法
文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段…...
C++【内存管理】(超详细讲解C++内存管理以及new与delete的使用和原理)
文章目录 1.C/C内存分布2.C语言中动态内存管理方式3.C内存管理方式3.1 new/delete操作内置类型3. 2new/delete操作自定义类型 4. operator new与operator delete函数(重点)5. new和delete的实现原理5.1 内置类型5.2 自定义类型5.2.1 自定义类型调用new[]…...
elementUi el-table 表头高度异常问题
1、现象 在同一个页面通过状态切换不同table时,当从有合并标头行的table切换到无合并表头的table时,无合并表头的table的表头的高度异常了,如下图 切换后 2、解决 给每个el-table 加上一个唯一的key <el-table key"1"></…...
kubekey的应用
随着 Kubernetes 社区的不断发展,即将迎来 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中,社区作出一个重要决策:不再默认集成 Docker 作为容器运行时,即取消了对 Docker 的默认支持。这就像咱们家厨房换了个新灶头ÿ…...
如何识别并分类转录因子的家族
愿武艺晴小朋友一定得每天都开心 当我们有了差异表达的转录因子列表以后,接下来可能就想知道这些转录因子的家族分布情况是怎样的?有没有1-2个Family在其中起主要作用,占比较多。 基于这种需求,可以按以下几步来实现: 1)从AnimalTFDB4转录因子数据库中,根据需要…...
【C++11】可变模板参数详解
个人主页:chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中,引入了可变模板参数(variadic templates),它为模板编程带来了革命性改变。它的出现允许我们…...
本地群晖NAS安装phpMyAdmin管理MySQ数据库实战指南
文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 本文主要介绍如何在群晖NAS安装MySQL与数据库管理软件p…...
QTableWidget 接口详情
Qt Widgets->C Classes->QTableWidget Qt 5.12版本QTableWidget接口详情(机翻) QTableWidget类提供了一个带有默认模型的基于项的表视图。 属性 列数columnCount : int 行数rowCount : int 细节描述 QTableWidget类提供了一个带有默认模型的基…...
GESP CCF python四级编程等级考试认证真题 2024年9月
一、单选题(每题 2 分,共 30 分) 第 1 题 据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的磁心存储元件由磁心颗粒组成…...
oracle数据库名实例名服务名
Oracle数据库是一个复杂的系统,它包含多个组件,包括数据库服务器、实例和服务。 数据库名(DB_NAME):这是数据库的内部名称,通常在创建数据库时指定,并在整个数据库生命周期内保持不变。 实例名…...
python+appium+雷电模拟器安卓自动化及踩坑
一、环境安装 环境:window11 1.1 安装Android SDK AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 这里面任选一个就可以,最终下载完主要要安装操作安卓的工具adb,安装这个步骤的前提是要…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
