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

news2024/11/24 1:40:29

问题

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 wave

def 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.coloradmin.cn/o/1452838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM-JVM中对象的生命周期

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 对象的创建 常量池检查:检查new指令是否能在常量池…

ESP32-Cam学习(1)——拍摄第一张照片

1.开发板介绍 使用的ESP32-Cam实物图为: 在某宝可以轻易买到。它分为主板,和底板。底板的主要功能是供电、程序下载等等。主板才是ESP32芯片的核心。 2.固件烧录 使用摄像头之前,需要给ESP32刷入支持摄像头的固件库,其下载地址为…

(07)Hive——窗口函数详解

一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路: LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…

线索化二叉树(先序,中序,后序)+线索化二叉树的遍历【java详解】

目录 线索化二叉树的基本介绍: 举个栗子: 二叉树的中序线索化: 创建HeroNode类,表示节点信息: 编写中序线索化方法代码: 中序线索化遍历代码: 测试代码: 测试结果&#xff1a…

OpenAI发布Sora技术报告深度解读!真的太强了!

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:洲与AI。 🎈 本文专栏:本文收录…

NodeJS背后的人:Express

NodeJS背后的人:Express 本篇文章,学习记录于:尚硅谷🎢 文章简单学习总结:如有错误 大佬 👉点. 前置知识:需要掌握了解: JavaScript基础语法 、Node.JS环境API 、前端工程\模块化 …

代码随想录算法训练营第53天 | 121.买卖股票的最佳时机 + 122.买卖股票的最佳时机II

今日任务 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 121.买卖股票的最佳时机 - Easy 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第…

Rust 语言学习杂谈 (end) (各种工作中遇到的疑难杂症)

1.在运行 “cargo build --release” 的时候,到底发生了什么? 源 (GPT4.0) : 当我们运行 cargo build --release 命令时,实际上在进行一系列复杂的步骤来编译和构建 Rust 项目的发布版本。这个过程大致可以分解为以下几个步骤:…

Java - SPI机制

本文参考:SPI机制 SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启动框架扩展和替换组件,主要是被框架的开发人员使用,比如 java.sql.Driver接口,其他…

【C语言】实现队列

目录 (一)队列 (二)头文件 (三) 功能实现 (1)初始化 (2) 销毁队列 (3) 入队 (4)出队 (5&a…

【论文精读】GPT1

摘要 如何从大量未标注文本中获取词级别的信息有两个主要挑战,使用何种优化目标能有效地学习文本表示,如何有效地将学习到的表示迁移到目标任务。针对这些问题,本文提出一种无监督预训练和有监督微调的组合的半监督方法,具体为&am…

Vue3+Ant-Design-Vue:报错Cannot read properties of null (reading ‘isCE‘)

问题描述 在使用Ant-Design-Vue内置的Table表格组件,实现expand展开行功能时,报错:Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) 。 报错信息图示: 在GitHub上找到如下描述, 解决方案 网上…

【maya 入门笔记】基本视图和拓扑

1. 界面布局 先看基本窗口布局,基本窗口情况如下: 就基本窗口布局的情况来看,某种意义上跟blender更像一点(与3ds max相比)。 那么有朋友就说了,玛格基,那blender最下面的时间轴哪里去了&…

书生浦语大模型实战营-课程笔记(4)

微调分为两种,增量预训练和指令跟随。 指令跟随微调: 1.只对答案计算Loss 2.训练时数据为一问一答的形式(input和output) 增量预训练: 只需要output的数据进行训练 xtuner:微调框架 操作部分的笔记参考git上的文档…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

python 基础知识点(蓝桥杯python科目个人复习计划43)

今日复习内容:做点真题和继续复习动态规划 例题1:三国游戏 (用的知识点是贪心和排序) 题目描述: 小蓝正在玩一款游戏,游戏中魏(X),蜀(Y)&…

HAL/LL/STD STM32 U8g2库 +I2C SSD1306/sh1106 WouoUI磁贴案例

HAL/LL/STD STM32 U8g2库 I2C SSD1306/sh1106 WouoUI磁贴案例 📍基于STM32F103C8T6 LL库驱动版本:https://gitee.com/chcsx/platform-test/tree/master/MDK-ARM🎬视频演示: WouoUI移植磁贴案例,新增确认弹窗 &#x1f…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题1. LCR 138. 有效数字——表示数值的字符串2. LCR 139. 训练计划…

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

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

AI数据中心网络架构需求:400/800G光模块

随着AI技术和相关应用的不断发展,大模型、大数据和AI计算能力在AI发展中的重要性日益凸显。大模型和数据集构成AI研究的软件基础,而AI算力是关键的基础设施。在本文中,我们将探讨AI发展对数据中心网络架构的影响。 Fat-Tree数据中心网络架构…