音视频采集推流时间戳记录方案
音视频同步更多文章
深入理解音视频pts,dts,time_base以及时间数学公式_视频pts计算-CSDN博客
ffplay音视频同步分析_ffplay 音视频同步-CSDN博客
音视频采集打时间戳设计
实时音视频数据的采集和处理场景。具体来说:
采集阶段:
- 在音视频数据采集过程中,需要为每一帧数据计算出时间戳。
- 可以采用"起始时间=系统时间"的方式,计算第一帧的时间戳,后续帧按照固定的帧间隔累加得到。
- 同时引入动态校正机制,检测累计时间戳与系统时间的偏差,及时修正时间戳。
传输阶段:
- 将计算好的时间戳与音视频数据一起传输到客户端。
播放阶段:
- 客户端接收到数据后,先将其缓存一段时间。
- 然后根据附带的时间戳信息,按照正确的时间顺序进行播放。
- 客户端可以进一步利用时间戳信息来调整缓冲区,以适应网络环境的变化。
这种时间戳设计方案的核心思路就是:
- 在采集端尽量保证时间戳的准确性和稳定性。后续讲解如何设计稳定和准确的方案
- 将时间戳信息传输到客户端,利用它来进行缓冲和时间校正。
- 通过客户端和服务器端的协作,最终实现音视频数据的平滑播放。
这是实时音视频领域常用的一种时间戳管理策略,能够很好地应对系统负载变化、小数误差累积等问题。
方案推导
第一方案 直接系统时间模式
初始化 starttime = systime
frameTimeStamp = systime - start time
缺陷:涉及到音频硬件采样不稳定,操作系统调度和网络传输的时间,导致ts准确度不够问题且没用纠正机制。
第二种方案 帧间隔模式
初始化 starttime = systime
frameTimeStamp = current systime - start time
Compute TimeStamp = last FrameTimeStamp + duration
优点:能输出frame duration稳定的音视频时间戳。
缺陷:
- 系统负载过高时,实际帧采集间隔可能与理论设定不一致。这将导致计算出的时间戳与实际情况不符,影响播放效果。
- 帧间隔涉及到无限小数时,会随时间累积产生较大的误差。例如预计30帧,通常按帧间隔33毫秒处理,但实际是33.3333333毫秒。累积3333帧(约111秒)就出现1秒的误差。
第三种方案 帧间隔+直接系统时间模式
初始化 starttime = systime //起始时间=系统时间
frameTimeStamp = current systime - start time //第一帧时间戳= 系统时间–起始时间
Compute TimeStamp = last FrameTimeStamp + duration //后续帧TimeStamp=上一帧时间戳+ 帧间隔
T = current systime - starttime //当前系统时间 – 起始时间
if( |Compute TimeStamp - T | >= duraiton/2 ) Compute TimeStamp = last FrameTimeStamp
//如果当前帧的计算时间戳(CurrentFrameTS)与系统时间差值(T)的绝对值大于等于一个半帧间隔,那么我们就应该将当前帧的时间戳直接设置为系统时间差值T。

解决:动态纠正,在第二方案基础上,解决了随着播放帧数,时间戳落后或提前现象。落点值 = T = current systime - starttime //当前系统时间 – 起始时间。关键点是设置一个合理的校正阈值,这里我们使用了半帧间隔。
优点:能够实时纠正时间戳,只要系统正常运转,就能立即恢复正确的时间戳。
缺陷:帧间隔不均匀,能否正常播放依赖于终端解决方案。 比如,假如音频一帧间隔为24毫秒,被采集的回调时间可能为20 毫秒,28毫秒,27毫秒,21毫秒。
终端解决这个问题,可以从以下几个方面着手:
在客户端使用自适应缓冲机制:
- 根据实际采集帧率的波动情况,动态调整缓冲区大小,尽量平滑播放。
在服务器端进行帧率转换:
- 服务器可以对不同帧率的数据进行帧率转换,输出稳定的帧率。
- 这样可以屏蔽掉客户端设备性能的影响。
使用更加先进的时间戳校正算法:
- 例如利用机器学习等方法,预测并修正时间戳的偏差。
采集时间戳同步问题分析
在使用帧间隔+直接系统模式基础上,发送端时间戳记录:
- 记录每一帧音视频数据的pts时间戳和pts_duration帧间隔
- 同时记录相邻帧之间的系统时间间隔 sys_duration
- 这样可以分析在采集阶段,帧间隔的稳定性
分析发送端时间戳:
- (1) ptsd(pts_duration)波动大,说明采集帧间隔不稳定,可能是由于系统负载波动等因素引起的
- 帧间隔 pts_duration 波动很大,那么意味着每帧数据被实际采集的时间间隔是不稳定的。这通常是由于系统负载波动、硬件性能波动等因素引起的,导致采集过程不够稳定。
- (2) pts稳定,但sysd(sys_duration)波动大,说明在数据发送过程中,速率不够稳定可能是网络传输过程中出现了抖动.
- 这里的 pts 时间戳是相对稳定的,意味着数据在采集端生成时间戳是比较准确的。但是,相邻帧之间的系统时间间隔 sys_duration 却出现了波动,说明在数据发送过程中,速率不够稳定。这种情况通常是由于网络传输过程中出现了抖动,导致实际发送速率不够平滑。
- (3) sysd和ptsd的值应该较为一致,如果两者差异较大,说明在整个采集-传输过程中存在问题
- 比如: [send]audio:1-pts:20ms-ptsd:24ms; sysd=23ms
接收端时间戳记录:
- 接收到的帧信息包含: 帧序号、pts时间戳、pts_duration帧间隔
- 同样记录了相邻帧的系统时间间隔 sys_duration
分析接收端时间戳:
- (1) ptsd(pts_duration)波动大,说明采集帧间隔不稳定
- (2) pts稳定,但sysd(sys_duration)波动大。说明在数据发送过程中,速率不够稳定
- 比如: [recv] audio:1-pts:20ms-ptsd:24ms; sysd=23ms 200ms
总结核心思路是:
- 在发送端和接收端同时记录时间戳信息,包括pts时间戳和系统时间
- 通过对这些时间戳数据的分析,可以全面诊断出音视频同步过程中的各种问题
- ptsd异常 采集端的帧间隔不稳定
- pts稳定下 sysd异常 推流端的数据传输速率不稳定,存在网络传输过程中的抖动。
学习资料分享
0voice · GitHub
相关文章:
音视频采集推流时间戳记录方案
音视频同步更多文章 深入理解音视频pts,dts,time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…...
【Linux】:线程安全 + 死锁问题
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 线程安全和重入问题&…...
【深度学习】时间序列表示方法
自然界除了2D的图片数据之外,还有语音、文字,这些数据都有时间的先后顺序的。对于2D的图像的数据,可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示,而Pytorch没有自带String支持,在表示文字之前需要进行Em…...
1.微服务灰度发布落地实践(方案设计)
文章目录 前言灰度发布的优点设计概要系统架构图流量控制客户端服务端 路由路径应用客户端实现核心组件分析1.网关2. spring-cloud3. dubbo4. nocas5. thread6. message queue 前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响…...
【UE5 C++课程系列笔记】15——Assert的基本使用
目录 概念 一、Check 二、Verify 三、Ensure 对比 基本使用 一、check的基本使用 二、ensure的基本使用 三、verify的基本使用 概念 assert 可在开发期间帮助检测和诊断不正常或无效的运行时条件。这些条件通常检查是否指针为非空、除数为非零、函数并非递归运行&…...
kubernetes Gateway API-1-部署和基础配置
文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…...
likeAdmin架构部署(踩坑后的部署流程
1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven:>3.8 ❤️.9 (最好不要3.9已经试过失败 node :node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK:JDK8 node 需要换源 npm c…...
【一款超好用的开源笔记Logseq本地Docker部署与远程使用指南】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
浅谈torch.utils.data.TensorDataset和torch.utils.data.DataLoader
1.torch.utils.data.TensorDataset 功能定位 torch.utils.data.TensorDataset 是一个将多个张量(Tensor)数据进行简单包装整合的数据集类,它主要的作用是将相关联的数据(比如特征数据和对应的标签数据等)组合在一起&…...
gesp(C++二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
gesp(C++二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵 题目描述 小杨想要构造一个 m m m \times m m...
FFmpeg:详细安装教程与环境配置指南
FFmpeg 部署完整教程 在本篇博客中,我们将详细介绍如何下载并安装 FFmpeg,并将其添加到系统的环境变量中,以便在终端或命令行工具中直接调用。无论你是新手还是有一定基础的用户,这篇教程都能帮助你轻松完成 FFmpeg 的部署。 一、…...
《特征工程:自动化浪潮下的坚守与变革》
在机器学习的广阔天地中,特征工程一直占据着举足轻重的地位。它宛如一位幕后的工匠,精心雕琢着原始数据,将其转化为能够被机器学习模型高效利用的特征,从而推动模型性能迈向新的高度。然而,随着技术的飞速发展…...
webrtc 源码阅读 make_ref_counted模板函数用法
目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…...
【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征的?附代码
【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征的?附代码 【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征…...
【Docker】离线安装 Docker
离线安装 Docker 在CentOS系统上安装Docker 1、下载 Docker 仓库文件 https://download.docker.com/linux/centos/docker-ce.repo 2、添加 Docker 仓库文件 将上一步下载的文件,移动到 /etc/yum.repos.d/ 目录 3、清除 YUM 缓存 sudo yum clean all sudo yum…...
三大行业案例:AI大模型+Agent实践全景
本文将从AI Agent和大模型的发展背景切入,结合51Talk、哈啰出行以及B站三个各具特色的行业案例,带你一窥事件驱动架构、RAG技术、人机协作流程,以及一整套行之有效的实操方法。具体包含内容有:51Talk如何让智能客服“主动进攻”&a…...
Dockerfile基础指令
1.FROM 基于基准镜像(建议使用官方提供的镜像作为基准镜像,相对安全一些) 举例: 制作基准镜像(基于centos:lastest) FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…...
12.30 linux 文件操作,磁盘分区挂载
ubuntu 在linux 对文件的相关操作【压缩,打包,软链接,文件权限】【head,tail,管道符,通配符,find,grep,cut等】脑图-CSDN博客 1.文件操作 在家目录下创建目录文件&#…...
[图形渲染]【Unity Shader】【游戏开发】 Shader数学基础17-法线变换基础与应用
在计算机图形学中,法线(normal) 是表示表面方向的向量。它在光照、阴影、碰撞检测等领域有着重要作用。本文将介绍如何在模型变换过程中正确变换法线,确保其在光照计算中的正确性,特别是法线与顶点的变换问题。 1. 法线与切线的基本概念 法线(Normal Vector) 法线(或…...
YOLOv9-0.1部分代码阅读笔记-train.py
train.py train.py 目录 train.py 1.所需的库和模块 2.def train(hyp, opt, device, callbacks): 3.def parse_opt(knownFalse): 4.def main(opt, callbacksCallbacks()): 5.def run(**kwargs): 6.if __name__ "__main__": 1.所需的库和模块 import …...
实战派必备:基于快马平台打造全能型ventoy系统救援启动盘
实战派必备:基于快马平台打造全能型ventoy系统救援启动盘 最近在折腾系统维护工具时,发现ventoy真是个神器。它不仅能同时装多个系统镜像到一个U盘,还能自定义菜单和工具包。不过网上的ventoy教程大多只教基础用法,真正适合实战的…...
Cheating Daddy终极故障排除指南:10个常见问题与解决方案
Cheating Daddy终极故障排除指南:10个常见问题与解决方案 【免费下载链接】cheating-daddy a free and opensource app that lets you gain an unfair advantage 项目地址: https://gitcode.com/gh_mirrors/ch/cheating-daddy Cheating Daddy是一款强大的实时…...
一次性拖鞋自动下料系统设计超声波热熔裁剪机设计【论文+CAD图纸+solidworks三维+开题报告+任务书+实习调研报告+其它相关资料】
一次性拖鞋自动下料系统与超声波热熔裁剪机的设计,聚焦于提升拖鞋制造环节的效率与精度。传统拖鞋生产中,人工下料易受操作误差影响,导致材料浪费与产品尺寸偏差;而普通裁剪方式可能因热熔不充分,出现边缘毛刺或连接不…...
SAHI切片推理实战:用YOLO做遥感图像小目标检测(含MMDetection对比)
SAHI与YOLO在遥感图像小目标检测中的深度实践指南 遥感图像分析正逐渐成为地理信息、农业监测和城市规划等领域的重要技术手段。面对大尺寸高分辨率图像中的微小目标检测难题,传统目标检测方法往往力不从心。本文将深入探讨如何利用SAHI切片推理技术结合YOLO模型&am…...
lingbot-depth-vitl14工业质检案例:玻璃瓶透明表面深度补全前后PSNR对比分析
lingbot-depth-vitl14工业质检案例:玻璃瓶透明表面深度补全前后PSNR对比分析 1. 引言:当工业质检遇上透明表面 在工业自动化生产线上,玻璃瓶、透明塑料件这类产品的质检一直是个头疼的问题。传统的视觉检测系统,面对透明或半透明…...
Qwen3.5-9B中微子:探测器结构理解+相互作用模拟+数据分析提示
Qwen3.5-9B中微子:探测器结构理解相互作用模拟数据分析提示 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解(图文输入)和长上下文处理ÿ…...
2026年3月AI十大爆点:开发者集体破防实录,这些事情你要懂,世界变天了,春风吹又生。
2026年3月AI圈炸了:十大事件带你体验“赛博过山车”! 哥们儿,姐们儿,三月的春风没吹绿江南岸,倒是把AI圈给彻底“卷”绿了!感觉就像你刚把代码里的Bug修完,一抬头,发现整个技术栈都…...
像素幻梦·创意工坊实操手册:批量生成任务队列管理与异步导出机制
像素幻梦创意工坊实操手册:批量生成任务队列管理与异步导出机制 1. 认识像素幻梦创意工坊 Pixel Dream Workshop(像素幻梦创意工坊)是一款基于FLUX.1-dev扩散模型的像素艺术生成工具。它采用16-bit像素风格的现代化界面设计,为创…...
nlp_structbert_sentence-similarity_chinese-large 处理长文本技巧:分段与聚合策略
nlp_structbert_sentence-similarity_chinese-large 处理长文本技巧:分段与聚合策略 你是不是遇到过这样的问题?手头有一篇几十页的技术文档,或者一篇上万字的学术论文,想用 nlp_structbert_sentence-similarity_chinese-large 这…...
ComfyUI 高频报错排查与修复指南(实战经验总结)
1. ComfyUI环境依赖冲突的终极解决方案 第一次打开ComfyUI就遇到红色报错提示?八成是环境依赖出了问题。我见过太多开发者在这个环节卡住好几天,其实大部分问题都有固定解法。先别急着重装系统,跟着我的排查清单一步步来。 最常见的环境冲突往…...
