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

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

一、回绕处理函数

/**  * Wrap a given time stamp, if there is an indication for an overflow  *  * @param st stream               // 传入一个指向AVStream结构体的指针,代表流信息  * @param timestamp the time stamp to wrap // 传入需要处理的时间戳  * @return resulting time stamp   // 返回处理后的时间戳  */  
static int64_t wrap_timestamp(const AVStream *st, int64_t timestamp)  
{  // 检查pts_wrap_behavior是否设置为不忽略,且pts_wrap_reference有效,并且传入的时间戳有效  if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&  st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {  // 如果pts_wrap_behavior设置为添加偏移量,并且时间戳小于参考时间戳  if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&  timestamp < st->pts_wrap_reference)  // 返回时间戳加上一个由pts_wrap_bits定义的偏移量(通常是2的pts_wrap_bits次方)  return timestamp + (1ULL << st->pts_wrap_bits);  // 如果pts_wrap_behavior设置为减去偏移量,并且时间戳大于或等于参考时间戳  else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&  timestamp >= st->pts_wrap_reference)  // 返回时间戳减去一个由pts_wrap_bits定义的偏移量  return timestamp - (1ULL << st->pts_wrap_bits);  }  // 如果不满足上述条件,则直接返回原始时间戳,不进行任何处理  return timestamp;  
}

该函数wrap_timestamp用于处理可能发生溢出的时间戳。在流式媒体处理中,由于时间戳通常是使用固定位数的整数来表示的,当时间戳超过该整数类型能够表示的最大值时,它可能会回绕(wrap around)到0或者负数,造成处理上的混乱。为了处理这种回绕情况,FFmpeg库提供了这样的机制。

  1. 函数首先检查是否启用了时间戳回绕处理(pts_wrap_behavior不为AV_PTS_WRAP_IGNORE),并且有一个有效的参考时间戳(pts_wrap_reference)以及传入的时间戳是有效的。

  2. 如果满足条件,则根据pts_wrap_behavior的值来决定是添加还是减去一个偏移量。偏移量的大小由pts_wrap_bits决定,通常是2的pts_wrap_bits次方。

  3. 如果pts_wrap_behavior设置为AV_PTS_WRAP_ADD_OFFSET,并且传入的时间戳小于参考时间戳,说明时间戳即将回绕到0,此时需要加上一个偏移量来避免回绕。
    如果pts_wrap_behavior设置为AV_PTS_WRAP_SUB_OFFSET,并且传入的时间戳大于或等于参考时间戳,说明时间戳还未回绕,此时需要减去一个偏移量来确保时间戳的连续性。
    如果上述条件都不满足,则函数直接返回原始的时间戳,不进行任何处理。

通过这个函数,可以确保在处理流式媒体时,即使时间戳发生回绕,也能得到正确且连续的时间戳值。

二、读取输入流时的回绕处理

读取输入流时的回绕处理在函数 int ff_read_packet(AVFormatContext *s, AVPacket *pkt);中,代码如下:

// 获取指定流的信息,stream_index 是数据包(pkt)所在的流的索引  
st = s->streams[pkt->stream_index];  // 调用 update_wrap_reference 函数,根据返回结果和流的 pts_wrap_behavior 设置来决定是否需要对时间戳进行调整  
if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {  // 如果流的 pts_wrap_behavior 是 AV_PTS_WRAP_SUB_OFFSET(即减去偏移量),并且 update_wrap_reference 返回 true  // 那么需要修正首次出现的时间戳为负值  // 如果 first_dts 不是相对值,则调用 wrap_timestamp 函数修正它  // 这里的目的是确保时间戳不会因为回绕而导致错误的排序  if (!is_relative(st->first_dts))  st->first_dts = wrap_timestamp(st, st->first_dts);  // 如果 start_time 不是相对值,同样调用 wrap_timestamp 函数修正它  // start_time 通常表示流的开始时间  if (!is_relative(st->start_time))  st->start_time = wrap_timestamp(st, st->start_time);  // 如果 cur_dts 不是相对值,也调用 wrap_timestamp 函数修正它  // cur_dts 表示当前解码时间戳  if (!is_relative(st->cur_dts))  st->cur_dts = wrap_timestamp(st, st->cur_dts);  
}  // 对数据包(pkt)的 dts(解码时间戳)调用 wrap_timestamp 函数进行修正  
pkt->dts = wrap_timestamp(st, pkt->dts);  // 对数据包(pkt)的 pts(显示时间戳)调用 wrap_timestamp 函数进行修正  
pkt->pts = wrap_timestamp(st, pkt->pts);

相关文章:

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理&#xff1a;保障流媒体时间连续性的核心机制 一、回绕处理函数 /** * Wrap a given time stamp, if there is an indication for an overflow * * param st stream // 传入一个指向AVStream结构体的指针&#xff0c;代表流信息 * pa…...

yolov8改进模型

YOLOv8 作为当前 YOLO 系列的最新版本&#xff0c;已经具备出色的性能。若要进一步改进&#xff0c;可以从网络架构优化、训练策略增强、多任务扩展和部署效率提升四个方向入手。以下是具体改进思路和实现示例&#xff1a; 1. 网络架构优化 (1) 骨干网络增强 引入 Transform…...

PostgreSQL日常运维

目录 一、PostgreSQL基础操作 1.1 登录数据库 1.2 数据库管理 1.3 数据表操作 二、数据备份与恢复 2.1 备份工具pg_dump 2.2 恢复工具pg_restore与psql 2.3 备份策略建议 三、模式&#xff08;Schema&#xff09; 3.1 模式的核心作用 3.2 模式操作全流程 四、远程连…...

<< C程序设计语言第2版 >> 练习 1-23 删除C语言程序中所有的注释语句

1. 前言 本篇文章介绍的是实现删除C语言源文件中所有注释的功能.希望可以给C语言初学者一点参考.代码测试并不充分, 所以肯定还有bug, 有兴趣的同学可以改进. 原题目是: 练习1-23 编写一个删除C语言程序中所有的注释语句. 要正确处理带引号的字符串与字符常量. 在C语言中, 注释…...

Fluence (FLT) 2026愿景:RWA代币化加速布局AI算力市场

2025年5月29日&#xff0c;苏黎世 - Fluence&#xff0c;企业级去中心化计算平台&#xff0c;荣幸地揭开其2026愿景的面纱&#xff0c;并宣布将于6月1日起启动四大新举措。 Fluence 成功建立、推出并商业化了其去中心化物理基础设施计算网络&#xff08;DePIN&#xff09;&…...

如何撰写一篇优质 Python 相关的技术文档 进阶指南

&#x1f49d;&#x1f49d;&#x1f49d;在 Python 项目开发与协作过程中&#xff0c;技术文档如同与团队沟通的桥梁&#xff0c;能极大提高工作效率。但想要打造一份真正实用且高质量的 Python 技术文档类教程&#xff0c;并非易事&#xff0c;需要在各个环节深入思考与精心打…...

选择if day5

5.scanf&#xff08;“空白符”&#xff09; 空白符作用表示匹配任意多个空白符 进入了内存缓冲区&#xff08;本质就是一块内存空间&#xff09; 6.scanf读取问题&#xff1a; a.遇到非法字符读取结束 2. %*d * 可以跳过一个字符 eg&#xff1a;%d%*d%d 读取第一和第三个字符…...

MiniMax V-Triune让强化学习(RL)既擅长推理也精通视觉感知

MiniMax 近日在github上分享了技术研究成果——V-Triune&#xff0c;这次MiniMax V-Triune的发布既是AI视觉技术也是应用工程上的一次“突围”&#xff0c;让强化学习&#xff08;RL&#xff09;既擅长推理也精通视觉感知&#xff0c;其实缓解了传统视觉RL“鱼和熊掌不可兼得”…...

Hash 的工程优势: port range 匹配

昨天和朋友聊到 “如何匹配一个 port range”&#xff0c;觉得挺有意思&#xff0c;简单写篇散文。 回想起十多年前&#xff0c;我移植并优化了 nf-HiPAC&#xff0c;当时还看不上 ipset hash&#xff0c;后来大约七八年前&#xff0c;我又舔 nftables&#xff0c;因为用它可直…...

同为.net/C#的跨平台运行时的mono和.net Core有什么区别?

Mono 和 .NET Core&#xff08;现已统一为 .NET&#xff09;都是 .NET 生态的跨平台实现&#xff0c;但它们在设计目标、技术特性和应用场景上有显著区别。以下是详细对比&#xff1a; ​​1. 历史背景​​ ​​项目​​​​诞生时间​​​​开发者​​​​当前状态​​​​Mo…...

前端安全直传MinIO方案

目的&#xff1a;前端直接上传文件到Minio&#xff0c;不通过服务器中转文件。密钥不能在前端明文传输。 ## 一、架构设计 mermaid sequenceDiagram 前端->>后端: 1.请求上传凭证 后端->>MinIO: 2.生成预签名URL 后端-->>前端: 3.返回预签名URL 前端->…...

HackMyVM-Dejavu

信息搜集 主机发现 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …...

LeetCode Hot100(动态规划)

70. 爬楼梯 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 题解&#xff1a; 不难发现&#xff0c;每一次都是从i-1或者i-2爬上来的&#xff0c;我们加起来求和即可 class So…...

Opencv实用操作5 图像腐蚀膨胀

相关函数 腐蚀函数 img1_erosion cv2.erode(img1,kernel,iterations1) &#xff08;图片&#xff0c;卷积核&#xff0c;次数&#xff09; 膨胀函数 img_dilate cv2.dilate(img2,kernel1,iterations1) &#xff08;图片&#xff0c;卷积核&#xff0c;次数&#xff09;…...

【赵渝强老师】OceanBase的部署架构

OceanBase数据库支持无共享&#xff08;Shared-Nothing&#xff0c;SN&#xff09;模式和共享存储&#xff08;Shared-Storage&#xff0c;SS&#xff09;模式两种部署架构。 一、 无共享&#xff08;Shared-Nothing&#xff0c;SN&#xff09;模式 在SN模式下&#xff0c;各…...

(18)混合云架构部署

文章目录 &#x1f680; 混合云架构部署&#xff1a;Java应用的云原生之旅&#x1f329;️ 混合云架构简介⚡ Java应用云原生部署五大核心技术1️⃣ 容器化与编排技术2️⃣ 服务网格与API网关3️⃣ CI/CD自动化流水线4️⃣ 多云管理平台5️⃣ 云原生Java框架与运行时 &#x1f…...

c/c++的opencv霍夫变换

OpenCV中的霍夫变换 (C/C) Hough Transform 霍夫变换 (Hough Transform) 是一种在图像分析中用于检测几何形状&#xff08;如直线、圆形等&#xff09;的特征提取技术。它通过一种投票机制在参数空间中寻找特定形状的实例。OpenCV 库为 C 开发者提供了强大且易用的霍夫变换函数…...

AAOS系列之(七) --- AudioRecord录音逻辑分析(一)

一文讲透AAOS架构&#xff0c;点到为止不藏私 &#x1f4cc; 这篇帖子给大家分析下 AudioRecord的初始化 1. 场景介绍: 在 AAOS 的 Framework 开发中&#xff0c;录音模块几乎是每个项目都会涉及的重要组成部分。无论是语音控制、车内对讲&#xff08;同行者模式&#xff09;…...

MySQL大表结构变更利器:pt-online-schema-change原理与实战指南

MySQL大表结构变更利器:pt-online-schema-change原理与实战指南 MySQL数据库运维中,最令人头疼的问题之一莫过于对大表进行结构变更(DDL操作)。传统的ALTER TABLE操作会锁表,导致业务长时间不可用,这在724小时运行的互联网业务中是不可接受的。本文将深入剖析Percona To…...

LangChain【3】之进阶内容

文章目录 说明一 LangChain Chat Model1.1 少量示例提示(Few-Shot Prompting)1.2 Few-Shot示例代码1.3 示例选择器&#xff08;Eample selectors&#xff09;1.4 ExampleSelector 类型1.5 ExampleSelector案例代码1.6 LangServe工具1.7 LangServe安装1.8 langchain项目结构1.9 …...

大规模JSON反序列化性能优化实战:Jackson vs FastJSON深度对比与定制化改造

背景&#xff1a;500KB JSON处理的性能挑战 在当今互联网复杂业务场景中&#xff0c;处理500KB以上的JSON数据已成为常态。 常规反序列化方案在CPU占用&#xff08;超30%&#xff09;和内存峰值&#xff08;超原始数据3-5倍&#xff09;方面表现堪忧。 本文通过Jackson与Fas…...

【OpenSearch】高性能 OpenSearch 数据导入

高性能 OpenSearch 数据导入 1.导入依赖库2.配置参数3.OpenSearch 客户端初始化4.创建索引函数5.数据生成器6.批量处理函数7.主导入函数7.1 函数定义和索引创建7.2 优化索引设置&#xff08;导入前&#xff09;7.3 初始化变量和打印开始信息7.4 线程池设置7.5 主数据生成和导入…...

HTML5有那些更新

语义化标签 header 头部nav 导航栏footer 底部aside 内容的侧边栏 媒体标签 audio 音频播放video 视频播放 dom查询 document.querySelector,document.querySelectorAll他们选择的对象可以是标签,也可以是类(需要加点),也可以是ID(需要加#) web存储 localStorage和sessi…...

AWS EC2 实例告警的创建与删除

在AWS云环境中&#xff0c;监控EC2实例的运行状态至关重要。通过CloudWatch告警&#xff0c;用户可以实时感知实例的CPU、网络、磁盘等关键指标异常。本文将详细介绍如何通过AWS控制台创建EC2实例告警&#xff0c;以及如何安全删除不再需要的告警规则&#xff0c;并附操作截图与…...

STM32 搭配 嵌入式SD卡在智能皮电手环中的应用全景评测

在智能皮电手环及数据存储技术不断迭代的当下&#xff0c;主控 MCU STM32H750 与存储 SD NAND MKDV4GIL-AST 的强强联合&#xff0c;正引领行业进入全新发展阶段。二者凭借低功耗、高速读写与卓越稳定性的深度融合&#xff0c;以及高容量低成本的突出优势&#xff0c;成为大规模…...

黑马点评项目01——短信登录以及登录校验的细节

1.短信登录 1.1 Session方式实现 前端点击发送验证码&#xff0c;后端生成验证码后&#xff0c;向session中存放键值对&#xff0c;键是"code"&#xff0c;值是验证码&#xff1b;然后&#xff0c;后端生成sessionID以Cookie的方式发给前端&#xff0c;前端拿到后&a…...

【笔记】Windows 系统安装 Scoop 包管理工具

#工作记录 一、问题背景 在进行开源项目 Suna 部署过程中&#xff0c;执行设置向导时遭遇报错&#xff1a;❌ Supabase CLI is not installed. 根据资料检索&#xff0c;需通过 Windows 包管理工具Scoop安装 Supabase CLI。 初始尝试以管理员身份运行 PowerShell 安装 Scoop…...

LVS + Keepalived高可用群集

目录 一&#xff1a;keepalived双击热备基础知识 1.keepalived概述及安装 1.1keepalived的热备方式 1.2keepalived的安装与服务控制 &#xff08;1&#xff09;安装keepalived &#xff08;2&#xff09;控制keepalived服务 2.使用keepalived实现双击热备. 2.1主服务器的…...

MySQL之约束和表的增删查改

MySQL之约束和表的增删查改 一.数据库约束1.1数据库约束的概念1.2NOT NULL 非空约束1.3DEFAULT 默认约束1.4唯一约束1.5主键约束和自增约束1.6自增约束1.7外键约束1.8CHECK约束 二.表的增删查改2.1Create创建2.2Retrieve读取2.3Update更新2.4Delete删除和Truncate截断 一.数据库…...

Greenplum:PB级数据分析的分布式引擎,揭开MPP架构的终极武器

一、Greenplum是谁&#xff1f;—— 定位与诞生背景 核心定位&#xff1a;基于PostgreSQL的开源分布式分析型数据库&#xff08;OLAP&#xff09;&#xff0c;专为海量数据分析设计&#xff0c;支撑PB级数据仓库、商业智能&#xff08;BI&#xff09;和实时决策系统。 诞生背…...