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

音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现

=================================================================

音视频入门基础:AAC专题系列文章:

音视频入门基础:AAC专题(1)——AAC官方文档下载

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件

音视频入门基础:AAC专题(3)——AAC的ADTS格式简介

音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析

音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现

音视频入门基础:AAC专题(6)——FFmpeg源码中解码ADTS格式的AAC的Header的实现

音视频入门基础:AAC专题(7)——FFmpeg源码中计算AAC裸流每个packet的size值的实现

音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现

音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现

音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现

=================================================================

一、引言

通过FFprobe命令:

ffprobe -of json -show_packets XXX.aac

可以显示AAC裸流每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts、pts_time、dts_time:

打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显示时间戳;“dts”是AVPacket结构体中的成员变量dts,是以AVStream->time_base为单位的解码时间戳;“pts_time”是以秒为单位的显示时间戳;“dts_time”是以秒为单位的解码时间戳。音频跟视频不一样,音频没有B帧,所以音频的pts和dts输出顺序一样,即pts等于dts。上述的这些值都是通过fftools/ffprobe.c中的show_packet函数打印出来的:

static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
{
//...print_ts  ("pts",             pkt->pts);print_time("pts_time",        pkt->pts, &st->time_base);print_ts  ("dts",             pkt->dts);print_time("dts_time",        pkt->dts, &st->time_base);
//...
}

AAC裸流每个packet的pts、dts、pts_time、dts_time的计算方式跟WAV音频文件的一致,实际上不管什么样格式的音频计算方法都是一样的,关于具体的计算原理可以参考:《音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现》、《音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现》。

简单来讲:

1.对于音频,其第1个packet的pts和dts的值为0。之后每个packet的pts和dts的值在上一个音频packet的pts和dts基础上增加duration,也就是增加该音频packet占用的以AVStream的time_base为单位的时间值,这是对任何格式的音频都通用的一种计算方式。不管是WAV音频文件还是AAC裸流,其每个音频packet的pts和dts值 = 上一个音频packet的pts和dts值 + duration。

2.pts_time = pts × time_base,dts_time = dts × time_base。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【d46】【Java】【力扣】234.回文链表
  • 详解QT元对象系统用法
  • RK3568部署DOCKER启动服务器失败解决办法
  • 实用小工具——多标签页插件Office Tab介绍
  • C++ 解析 RDP 协议
  • 分布式Redis(14)哈希槽
  • 数据可视化pyecharts——数据分析(柱状图、折线图、饼图)
  • 【算法——双指针】
  • 每日一题——第九十七题
  • 【掘金量化使用技巧】用日线合成长周期k线
  • JavaScript发送邮件:实现前端触发的教程?
  • react的组件的概念和使用
  • C++——求3*3矩阵对角元素之和。
  • go语言 swagger 查询 json 字段注释
  • 教你用 python 在国内实现 openAi 的调用
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017前端实习生面试总结
  • 30秒的PHP代码片段(1)数组 - Array
  • AWS实战 - 利用IAM对S3做访问控制
  • axios 和 cookie 的那些事
  • Bytom交易说明(账户管理模式)
  • CentOS从零开始部署Nodejs项目
  •  D - 粉碎叛乱F - 其他起义
  • ES6 学习笔记(一)let,const和解构赋值
  • exports和module.exports
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript函数式编程(一)
  • Java精华积累:初学者都应该搞懂的问题
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python学习之路16-使用API
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 警报:线上事故之CountDownLatch的威力
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 试着探索高并发下的系统架构面貌
  • 小程序01:wepy框架整合iview webapp UI
  • 写代码的正确姿势
  • ​secrets --- 生成管理密码的安全随机数​
  • ​ssh免密码登录设置及问题总结
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #stm32驱动外设模块总结w5500模块
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ()、[]、{}、(())、[[]]命令替换
  • (04)odoo视图操作
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ros//EnvironmentVariables)ros环境变量
  • (二) 初入MySQL 【数据库管理】
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十六)、把镜像推送到私有化 Docker 仓库
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)C#调用WebService 基础