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

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

一、引言

本文讲解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.lryc.cn/news/440593.html

相关文章:

  • React 组件的基本使用,useState 状态变量的使用
  • 空洞骑士 Hollow Knight 攻略
  • CSP-J 算法基础 广度优先搜索BFS
  • What is new in C# 7,8,9,10
  • Sqlserver常用sql
  • 基于SpringBoot+Vue+MySQL的考研互助交流平台
  • chatgpt个人版ssrf漏洞
  • 如何查看微信聊天记录?四种实用方法查询微信聊天记录,赶快码住!
  • 钢材表面缺陷数据集以coco格式做好了数据集的划分,1200张训练集,600张验证集,对应的json文件也在里面
  • 【Lua坑】Lua协程coroutine无法正常完整执行问题
  • istio中serviceentry结合egressgateway的使用
  • 使用 Python 实现 Windows 应用图标的便捷生成:一站式 PNG 转 ICO 工具20240918
  • 编程环境常用命令合集
  • Qt Creator 集成开发环境 常见问题
  • 使用Faiss进行K-Means聚类
  • 通过hosts.allow和hosts.deny限制用户登录
  • PWN College 关于sql盲注
  • 【Linux篇】Http协议(1)(笔记)
  • 员工疯狂打CALL!解锁企业微信新玩法,2024年必学秘籍来啦!
  • Spring boot从0到1 - day01
  • Flutter 项目结构的区别
  • EfficientFormerV2:重新思考视觉变换器以实现与MobileNet相当的尺寸和速度。
  • ASP.NET Core高效管理字符串集合
  • vm-tools的卸载重装,只能复制粘贴,无法拖拽文件!
  • Docker 容器网络技术
  • C++ 起始帧数、结束帧数、剪辑视频
  • 【项目一】基于pytest的自动化测试框架———解读requests模块
  • 升级Ubuntu内核的几种方法
  • Android绘制靶面,初步点击位置区域划分取值测试
  • 【SpringBoot】调度和执行定时任务--Quartz(超详细)