pts_dts解析

2023-10-14 11:10
文章标签 解析 dts pts

本文主要是介绍pts_dts解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在ffmpeg中,经常看到avpriv_set_pts_info(st, 33, 1, 90000);用来设置AVStream的time_base。

void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)

但是,为什么pts_wrap_bits为33,pts_den为90000,我们并不知道原因。本文将详细讲解,为什么pts、dts的采样频率为90KHz。

ISO/IEC 13818-1标准或ITU-T H.222.0 标准都是指MPEG-2标准。

H.222标准中规定,系统时钟频率(system clock frequency)为27MHz。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x219wqNK-1613904470548)(system_clock_frequency.png)]

H.222标准中规定,PTS和DTS由33个bits来表示,time scale 为90000(system_clock_frequency/300)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于PTS, t p n ( k ) = P T S ( k ) 90 K H z tp_n(k)=\frac {PTS(k)}{90KHz} tpn(k)=90KHzPTS(k);PTS(k)是以系统时钟频率的300分频为单位的计数值, t p n ( k ) tp_n(k) tpn(k)是以秒为单位的显示时间戳;

对于DTS, t d n ( k ) = D T S ( k ) 90 K H z td_n(k)=\frac {DTS(k)}{90KHz} tdn(k)=90KHzDTS(k);DTS(k)是以系统时钟频率的300分频为单位的计数值, t d n ( k ) td_n(k) tdn(k)是以秒为单位的解码时间戳;

这里可将 s y s t e m _ c l o c k _ f r e q u e n c y 300 \frac {system\_clock\_frequency}{300} 300system_clock_frequency叫做time_scale。time_scale = 90000,time_base = 1/90000(s)

在这里插入图片描述

最后再梳理一下avpriv_set_pts_info

void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,unsigned int pts_num, unsigned int pts_den)
{AVRational new_tb;if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {if (new_tb.num != pts_num)av_log(NULL, AV_LOG_DEBUG,"st:%d removing common factor %d from timebase\n",s->index, pts_num / new_tb.num);} elseav_log(NULL, AV_LOG_WARNING,"st:%d has too large timebase, reducing\n", s->index);if (new_tb.num <= 0 || new_tb.den <= 0) {av_log(NULL, AV_LOG_ERROR,"Ignoring attempt to set invalid timebase %d/%d for st:%d\n",new_tb.num, new_tb.den,s->index);return;}s->time_base     = new_tb; // 设置AVStream的时间基准
#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGSs->codec->pkt_timebase = new_tb;
FF_ENABLE_DEPRECATION_WARNINGS
#endifs->internal->avctx->pkt_timebase = new_tb; // 设置AVCodecContext的时间基准s->pts_wrap_bits = pts_wrap_bits; // 记录pts存储所需的位数,33bits
}

avpriv_set_pts_info(st, 33, 1, 90000);最终s->time_base = {1, 90000}。通过AVRational的num/den,即1/90000就可以非常容易的将pts转为pts_time。

总之,ffmpeg中所谓的time_base,time_scale不管它怎么变,本质上就是一个pts(dts)和pts_time(dts_time)转换的问题。

这篇关于pts_dts解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210098

相关文章

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应