【Python】测量WAV文件播放时长

问题

windows播放WAV音频文件,一般使用API函数,如PlaySound。实际使用发现,从调用PlaySound到实际开始播放存在200ms以上的延时,在游戏编程中音效实时性是个需要解决的问题。

本文主要讨论,windows播放WAV文件的衍生问题:如何测量WAV文件的播放时长?

解决方法

1、WAV文件头部格式

WAV(Waveform Audio File Format)是一种常见的音频文件格式,它以无损的方式存储音频数据。每个WAV文件都包含一个文件头(Header)来描述音频的格式和属性。下面是WAV文件头的一般格式:

typedef struct {char     riff[4];        // "RIFF"标识符DWORD    fileSize;       // 文件总大小(不包括riff和fileSize字段本身的大小)char     wave[4];        // "WAVE"标识符char     fmt[4];         // "fmt "标识符DWORD    fmtSize;        // fmt块大小WORD     audioFormat;    // 音频格式代码(例如,PCM为1)WORD     numChannels;    // 声道数DWORD    sampleRate;     // 采样率DWORD    byteRate;       // 每秒的字节数WORD     blockAlign;     // 数据块对齐单位(每个采样帧的字节数)WORD     bitsPerSample;  // 每个采样的位数char     data[4];        // "data"标识符DWORD    dataSize;       // 音频数据大小
} WAVHeader;

WAV文件头的结构包括以下字段:

  • riff: 固定为"RIFF",表示文件类型。
  • fileSize: 文件的总大小,不包括rifffileSize字段本身的大小。
  • wave: 固定为"WAVE",表示音频格式类型。
  • fmt: 固定为"fmt ",表示音频格式块。
  • fmtSize: fmt块的大小。
  • audioFormat: 音频格式代码,常见的PCM格式为1。
  • numChannels: 声道数,如单声道为1,立体声为2。
  • sampleRate: 采样率,表示每秒采样的次数。
  • byteRate: 每秒的字节数,计算方式为sampleRate * numChannels * bitsPerSample / 8
  • blockAlign: 数据块对齐单位,表示每个采样帧的字节数,计算方式为numChannels * bitsPerSample / 8
  • bitsPerSample: 每个采样的位数,表示音频的精度。
  • data: 固定为"data",表示音频数据块。
  • dataSize: 音频数据的大小,即音频数据块的字节数。

2、使用Python计算WAV文件播放时长

import wavedef get_wav_duration(file_path):with wave.open(file_path, 'rb') as wav_file:# 获取音频文件的帧数frames = wav_file.getnframes()# 获取帧速率(每秒的帧数)frame_rate = wav_file.getframerate()# 计算音频时长(单位:秒)duration = frames / float(frame_rate)return duration# 指定 WAV 文件的路径
file_path = 'D:/01.Study/PYTHON/01/1.wav'# 调用函数获取时长
duration = get_wav_duration(file_path)
print("文件时长:{} 秒".format(duration))

 执行后的结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473564.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义,通过 SQL 语句使用视图时…

C语言-生成随机数

目录 1 rand()函数 2 srand()函数 1 rand()函数 int rand (void); rand函数可以生成一个随机整数,范围在 0 ~ RAND_MAX,RAND_MAX的值是0x7fff,换算成十进制是32767。 但是我们发现使用此函数生成随机数,每次生成的随机数都是一…

【C深度解剖】前置++与后置++

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

程序员搞什么副业才有性价比?

干一行恨一行,三百六十行,行行干破防! 一份稳定的主业固然重要,但是有性价比的副业更令人心动。朝九晚五的工作日复一日,当然也可能是996的生活反复捶打。从整体来讲,程序员算是高收入群体,但往…

从六大晶圆厂财报看半导体行业2024年复苏

2023年,全球半导体行业经历了重大调整,在面临高通胀风险及库存水平调整的过程中,市场短期展望并不明朗。然而,根据TrendForce对全球六大顶尖半导体代工厂(TSMC、三星电子、英特尔、GlobalFoundries、UMC和SMIC&#xf…

函数、极限、连续——刷题(4

目录 1.题目:2.解题思路和步骤:3.总结:小结: 1.题目: 2.解题思路和步骤: 记住这个公式即可: 所以就很容易求解了: 3.总结: 记住这个公式即可: 小结&am…

mysql 执行update操作 记录未修改

问题 mysql 执行update操作 记录未修改 详细问题 笔者进行SpringBootMybatis项目开发,确认执行update操作 控制台内容如下 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3cbe9459] was not registered for sync…

算法——数论——同余

目录 同余 一、试题 算法训练 同余方程 同余 同余使人们能够用等式的形式简洁地描述整除关系同余:若 m(正整数),a 和 b 是整数,a%mb%m,或(a-b)%m0,记为 a b(mod m)求解一元线性同余方程等价于…

Halcon 相机标定

文章目录 算子单相机标定单相机标定畸变的矫正 算子 gen_caltab 生成标定文件 gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile :) 算子来制作一个标定板XNum 每行黑色标志圆点的数量。YNum 每列黑色标志圆点的数…

2023年程序员观察报告

春节假期已过,2023年悄然过去,2024年已经到来,无论2023年是快乐的、成长的、积极的,亦或是痛苦的、寂寥的、迷茫的,都要恭喜在座的各位程序员又熬过了一年! ①加班篇 2023年,你完成了 132个需求…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构,创建一颗二叉树必须首先确定树中结点的输入顺序,常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…