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

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

一、引言

本文讲解FFmpeg源码对WAV音频文件进行解复用(解封装)时,其AVStream的time_base是怎样被计算出来的。

二、FFmpeg源码中计算WAV音频文件AVStream的time_base的实现

从《音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现》中可以知道,FFmpeg对WAV音频文件进行解复用(解封装)时,其源码内部会调用wav_read_header函数解码WAV音频文件的WAV Header。而该函数内部会调用wav_parse_fmt_tag函数解析“Format chunk”子区块:

​for (;;) {//...switch (tag) {case MKTAG('f', 'm', 't', ' '):/* only parse the first 'fmt ' tag found */if (!got_xma2 && !got_fmt && (ret = wav_parse_fmt_tag(s, size, st)) < 0) {return ret;} else if (got_fmt)av_log(s, AV_LOG_WARNING, "found more than one 'fmt ' tag\n");got_fmt = 1;break;}}
}​

wav_parse_fmt_tag函数内部会调用avpriv_set_pts_info函数设置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会被设置为st->codecpar->sample_rate。也就是说WAV音频文件AVStream的time_base为音频采样频率的倒数:

static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream *st)
{AVIOContext *pb = s->pb;WAVDemuxContext *wav = s->priv_data;int ret;/* parse fmt header */ret = ff_get_wav_header(s, pb, st->codecpar, size, wav->rifx);if (ret < 0)return ret;handle_stream_probing(st);ffstream(st)->need_parsing = AVSTREAM_PARSE_FULL_RAW;avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);return 0;
}

三、总结

WAV音频文件AVStream的time_base为音频采样频率的倒数。比如音频采样频率为44100Hz,其AVStream的time_base为1/44100(44100分之一)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • echarts处理y轴最大小值根据数据动态处理、分割数和是否从0开始
  • 衡石科技产品手册-指标分析
  • OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用
  • 赞奇科技与华为云共襄828 B2B企业节,激活数字内容“云”创作
  • 理解并优化页面启动时的周期性数据发送代码
  • Java算法之堆排序(Heap Sort)
  • 跨部门协作:搭建共享型客服知识库
  • python网络爬虫(二)——数据的清洗与组织
  • 浅谈JAVA中的SPI机制
  • 制作 Docker 镜像
  • 有关树形结构数据的功能函数
  • Uniapp 调用aar、jar包
  • 什么是Jmeter ?Jmeter使用的原理步骤是什么?
  • Cobalt Strike 4.8 用户指南-第五节-获取初始访问
  • [数据集][目标检测]玻璃瓶塑料瓶检测数据集VOC+YOLO格式8943张2类别
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017届校招提前批面试回顾
  • ES6 ...操作符
  • magento2项目上线注意事项
  • Making An Indicator With Pure CSS
  • Objective-C 中关联引用的概念
  • Shadow DOM 内部构造及如何构建独立组件
  • Solarized Scheme
  • 闭包,sync使用细节
  • 复杂数据处理
  • 给第三方使用接口的 URL 签名实现
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端之React实战:创建跨平台的项目架构
  • 如何在招聘中考核.NET架构师
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT(TCP网络编程-服务端)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (9)STL算法之逆转旋转
  • (C语言)逆序输出字符串
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm码农论坛 毕业设计 231126
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (四)Controller接口控制器详解(三)
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)Docker基本介绍
  • (转)3D模板阴影原理
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 8 跨平台高性能边缘采集网关
  • .net Application的目录
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NET性能优化(文摘)
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @Bean注解详解
  • @JsonFormat与@DateTimeFormat注解的使用
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)