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

ops/2024/9/22 12:44:37/

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

音视频入门基础: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的实现

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

一、引言

本文讲解FFmpeg源码对AAC裸流行解复用(解封装)时,其AVStream的time_base是怎样被计算出来的。

二、FFmpeg源码中计算AAC裸流AVStream的time_base的实现

FFmpeg对AAC裸流进行解复用(解封装)时,其源码内部会调用adts_aac_read_header函数:

static int adts_aac_read_header(AVFormatContext *s)
{AVStream *st;int ret;st = avformat_new_stream(s, NULL);if (!st)return AVERROR(ENOMEM);st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;st->codecpar->codec_id   = AV_CODEC_ID_AAC;ffstream(st)->need_parsing = AVSTREAM_PARSE_FULL_RAW;ff_id3v1_read(s);if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {int64_t cur = avio_tell(s->pb);ff_ape_parse_tag(s);avio_seek(s->pb, cur, SEEK_SET);}ret = adts_aac_resync(s);if (ret < 0)return ret;// LCM of all possible ADTS sample ratesavpriv_set_pts_info(st, 64, 1, 28224000);return 0;
}

adts_aac_read_header函数内部通过执行语句:

    // LCM of all possible ADTS sample ratesavpriv_set_pts_info(st, 64, 1, 28224000);

设置AVStream的time_base。关于avpriv_set_pts_info函数的用法可以参考:《FFmpeg源码:avpriv_set_pts_info函数分析》。可以看到,调用avpriv_set_pts_info函数后,st->time_base.num会被设置为1,st->time_base.den会被设置为28224000。也就是说AAC裸流AVStream的time_base固定为28224000分之一。

所以为啥AAC裸流AVStream的time_base的分母固定是28224000呢?从《音视频入门基础:AAC专题(3)——AAC的ADTS格式简介》可以知道,ADTS格式的AAC编码的音频的采样频率取值如下图所示。而28224000恰好是下面全部采样频率的最小公倍数(LCM,Least Common Multiple)。所以AAC裸流AVStream的time_base的分母取值28224000,可以满足所有可能的ADTS音频采样率情况:

三、总结

AAC裸流AVStream的time_base固定为28224000分之一,这个计算方式跟WAV音频文件是不一样的。各位同学可以把本文跟《音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现》进行对比,以加深对音频AVStream的time_base的理解。


http://www.ppmy.cn/ops/114246.html

相关文章

【Taro】初识 Taro

笔记来源&#xff1a;编程导航。 概述 Taro 官方文档&#xff1a;https://taro-docs.jd.com/docs/ &#xff08;跨端开发框架&#xff09; Taro 官方框架兼容的组件库&#xff1a; taro-ui&#xff1a;https://taro-ui.jd.com/#/ &#xff08;最推荐&#xff0c;兼容性最好&…

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…

数字IC设计\FPGA 职位经典笔试面试整理--基础篇1

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 1&#xff1a;什么是同步逻辑和异步逻辑&#xff1f; 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点&#xff1a;各触发器的时钟端全部连接在一…

在IntelliJ IDEA中创建一个HTML项目

在IntelliJ IDEA中创建一个HTML项目是一个相对直接的过程&#xff0c;尽管IDEA本身是一个功能强大的Java集成开发环境&#xff08;IDE&#xff09;&#xff0c;但它也支持Web开发&#xff0c;包括HTML、CSS、JavaScript等前端技术的开发。以下是一个详细的步骤指南&#xff0c;…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

关于ClickHouse建表 集群表 SQL

下面将介绍一下 ClickHouse 建表SQL ,集群名 star_cluster 我这里以test 表 test_all 集群表 为演示 可以执行下面的SQL 新建本地表 DROP TABLE IF EXISTS test ON CLUSTER star_cluster; DROP TABLE IF EXISTS test_all ON CLUSTER star_cluster; CREATE TABLE test …

解决R包依赖版本不兼容问题

ERROR: dependency ‘Matrix’ is not available for package ‘irlba’ removing ‘/root/anaconda3/envs/myview/lib/R/library/irlba’ ERROR: dependency ‘Matrix’ is not available for package ‘N2R’ removing ‘/root/anaconda3/envs/myview/lib/R/library/N2R’ ER…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …