wav音频文件解析

news2024/11/24 17:21:00

一、音频相关概念

1、样本

A/D转换器以每秒钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本。通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。

2、采样频率

每一秒钟所采样的数目称为采样频率,单位hz,典型值是11025Hz、22050Hz和44100Hz。

采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论:如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号。

3、采样分辩率(采样精度)

采样分辨率指的是在数字音频中用于表示每个采样值的位数。它决定了数字音频系统可以表示的动态范围和精度。常见的采样分辨率有8位、12位和16位等。位数越高,表示的动态范围越大,音频质量也更高。

4、数据传输速率

每秒平均传输的字节数,播放软件利用此值可以估计缓冲区的大小,计算公式:声道数×采样频率×每样本的数据位数 / 8

4、WAV文件

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范, “RIFF”是wav文件识别码.

数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是little-endian字节顺序,标志符并不是字符串而是单独的符号。

  1. 偏移地址大小(字节)数据块类型内容
    00H~03H44字符大写字符串"RIFF",标明该文件为有效的 RIFF 格式文档。
    04H~07H 4长整数  从下一个字段首地址开始到文件末尾的总字节数。该字段的数值加 8 为当前文件的实际长度。
     08H~0BH44字符所有 WAV 格式的文件此处为字符串"WAVE",标明该文件是 WAV 格式文件。
     0CH~OFH44字符小写字符串"fmt ",最后一位空格。
    10H~13H4整数 过滤字节(一般为00000010H),若为00000012 H则说明数据头携带附加信息(见“附加信息”)。
     14H~15H2整数 PCM 脉冲编码调制格式种类(该数值通常为1,表示数据为线性PCM编码)
    16H~17H2整数通道数,单声道为1,双声道为2
    18H~1BH4长整数采样频率
    1CH~1FH长整数数据传输速率(每秒平均字节数)
    20H~21H整数采样帧大小。该数值为:声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。
    22H~23H2整数采样位数,存储每个采样值所用的二进制数位数
     随后2字节整数附加信息(可选,由上方过滤字节确定)
    随后...不定长度字符

     "fact",该部分是可选部分,一般当WAV文件是由某些软件转换而来时,包含该部分。

    若包含该部分:
    (1)该部分的前4字节为数据头,一般为4个字母,
    (2)随后4个字节表示长度,即除去头(4字节)和长度(4字节)之后,数据本身的长度。

    (3)最后的字节为数据本身。
    例如:“66 61 7374 04 00 00 00 F8 2F 14 00“,"66 61 73 74"是fact字段的数据头,"04 00 00 00是数据本身的长度,“F8 2F 14 00”是数据本身。(注意是little-endian字节顺序)

    随后4字节4 4字符数据标志符"data"
    随后4字节4 长整型DATA总数据长度字节
     随后...DATA数据块

    //数据头定义
    struct T_RecorderWavHeader
    {
        //RIFF chunk descriptor 12byte
        char            riff[4];            // = "RIFF"
        uint32_t        size_8;             // = FileSize - 8
        char            wave[4];            // = "WAVE"
    
        //fmt sub-chunk  24byte
        char            fmt[4];             // = "fmt "
        uint32_t        format_size;        // = 过滤字节(一般为00000010H,若为00000012H说明数据头携带附加信息)
        uint16_t        format_tag;         // = 常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1
        uint16_t        channels;           // = 声道个数: 单声道为 1,立体声或双声道为 2
        uint32_t        samples_per_sec;    // = 采样频率 : 8000 | 6000 | 11025 | 16000 | 22050  | 44100
        uint32_t        avg_bytes_per_sec;  // = 数据传输速率(每秒平均字节数):声道数×采样频率×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
                                            // = samples_per_sec * channels * bits_per_sample / 8
        uint16_t        block_align;        // = 每采样点字节数 : 声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。
                                            // = channels * bits_per_sample / 8
        uint16_t        bits_per_sample;    // = 采样位数: 存储每个采样值所用的二进制数位数, 8 | 16
    
        //data sub-chunk  8byte
        char            data[4];            // = "data";
        uint32_t        data_size;          // = 纯数据长度 : FileSize - 44
    };
    
    // 根据本系统的具体字节序处理的存放格式
    #if   __BYTE_ORDER == __LITTLE_ENDIAN
    
    	#define RIFF ('F'<<24 | 'F'<<16 | 'I'<<8 | 'R'<<0)
    	#define WAVE ('E'<<24 | 'V'<<16 | 'A'<<8 | 'W'<<0)
    	#define FMT  (' '<<24 | 't'<<16 | 'm'<<8 | 'f'<<0)
    	#define DATA ('a'<<24 | 't'<<16 | 'a'<<8 | 'd'<<0)
    
    	#define LE_SHORT(val) (val) 
    	#define LE_INT(val)   (val) 
    
    #elif __BYTE_ORDER == __BIG_ENDIAN
    
    	#define RIFF ('R'<<24 | 'I'<<16 | 'F'<<8 | 'F'<<0)
    	#define WAVE ('W'<<24 | 'A'<<16 | 'V'<<8 | 'E'<<0)
    	#define FMT  ('f'<<24 | 'm'<<16 | 't'<<8 | ' '<<0)
    	#define DATA ('d'<<24 | 'a'<<16 | 't'<<8 | 'a'<<0)
    
    	#define LE_SHORT(val) bswap_16(val) 
    	#define LE_INT(val)   bswap_32(val) 
    
    #endif
    

    根据对WAV格式的了解,编写了一个对wav音频文件的裁剪工具,欢迎大家点击下载。

  2. 参考博客:【音频驱动】Linux之ALSA声卡、WAV文件相关概念_alsa 音频-CSDN博客

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

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

相关文章

天融信TOPSEC安全管理系统存在远程命令执行漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 天融信TopSec 安全管理系统&#xff0c;是基于大数据架构&#xff0c;采用多种技术手段收集各类探针设备安全数据&#xff0c;围绕资产、漏洞、攻击、威胁等安全要素进行全面分析&#xff0c;提供统一监测告警、集…

机器视觉在食品安全检测领域的应用与展望

​随着人们生活水平的提高&#xff0c;对食品安全的要求也越来越高。在这种背景下&#xff0c;机器视觉技术作为一种高效、准确的自动化检测手段&#xff0c;在食品安全检测领域扮演着越来越重要的角色。机器视觉系统通过模拟人眼的视觉功能&#xff0c;借助相机和计算机视觉算…

自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程

大家好,我是微学AI,今天给大家介绍一下自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程。在大模型ChatGPT发布之前,NLP领域是BERT,T5模型为主导,T5(Text-to-Text Transfer Transformer)是一种由Google Brain团队在2019年提出的自然…

羊奶能降低熬夜伤肝带来的伤害吗?

羊奶能降低熬夜伤肝带来的伤害吗&#xff1f; 熬夜已成为现代人生活中的一部分&#xff0c;然而&#xff0c;长期熬夜对身体健康的危害也不容忽视。其中&#xff0c;肝脏作为人体重要的器官之一&#xff0c;承担着排毒、合成重要蛋白质和代谢脂肪等重要功能。长期熬夜所带来的…

C语言---扫雷(Minesweeper)

扫雷 1 了解扫雷游戏1.1 基本规则1.2 基础知识1.2.1字符相减 2 实现过程1.1 棋盘设定1.2 初始化棋盘1.3 打印棋盘1.4 放置雷1.5 排查雷1.6 game()函数 3 完整代码3.1 Minesweeper.h3.2 Minesweeper.c3.3 Test.c 4 参考 1 了解扫雷游戏 点击右侧进入扫雷游戏网页版 1.1 基本规…

性能测试能力提升 —— 线程、并发、吞吐量、TPS、QPS、响应时间

一、背景 接着上一篇的知识&#xff1a;性能测试能力提升-关于性能测试&#xff0c;本篇文章&#xff0c;我们将主要介绍以下几方面的知识&#xff1a; 线程数&并发用户数相对并发&绝对并发吞吐量TPS&QPS响应时间 二、线程数、并发用户数 线程数: 主流的性能测…

【ArcGIS微课1000例】0083:地震灾害图件制作之土壤类型分布图

本文基于1:400万矢量土壤图,制作甘肃积石山6.2级地震100km范围内土壤类型分布图。 文章目录 一、土壤分布图预览二、数据集来源及简介三、土壤分布图制作一、土壤分布图预览 二、数据集来源及简介 1. 数据来源 数据集为1:400万中国土壤图,1:400万中国土壤图(2000)由中国科…

dp专题7 分割等和子集

本题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目&#xff1a; 思路&#xff1a; 由题意&#xff0c;题目意思是给出 数组 nums 找出两个子集它们的元素和相等。 这里两个自己的元素和相等&#xff0c;说明需要 数组 nu…

PyQt5-控件之QDialog(UI-业务分离搭建自定义xDialog)

1.继承QtWidgets.QWidget自定义对话框 继承于QtWidgets.QWidget自定义一个对话框类&#xff1a;SelectingDlg class SelectingDlg(QtWidgets.QWidget): def __init__(self): super(SelectingDlg, self).__init__() self.initUI() def initUI(self):s…

上网行为管理系统丨上网行为管理一体化解决方案

随着互联网的普及和发展&#xff0c;企业的网络安全和员工的行为管理已经成为了一个重要的问题。为了解决这个问题&#xff0c;上网行为管理一体化解决方案应运而生。本文将深入探讨上网行为管理一体化解决方案的背景、概念、重要性、实现方式和未来发展等方面。 一、概念 上网…

守正出奇,穿越周期 - Bytebase 的 2023

前情提要&#xff1a;Bytebase 的 2022&#xff5c;埋头苦干&#xff0c;孕育希望 产品迭代 2023 年共发布了 25 个版本。这个数字和 2022 年一样&#xff0c;除开春节和一次全员疫情&#xff0c;做到了两周一次的更新。 版本号从 1.11.0 升级到了 2.13.0。其中在 5 月份&…

25W以下室内照明应用解决方案:SM2188EN符合新ERP认证标准

随着LED照明技术的不断发展&#xff0c;室内照明领域的需求也在不断增加。针对25W以下室内照明应用&#xff0c;LED驱动芯片SM2188EN是一款新型的解决方案&#xff0c;符合最新的ERP认证标准&#xff0c;能够满足用户对照明产品高效、节能、稳定的需求。 SM2188EN方案原理图 L…

TDD-LTE TAU流程

目录 1. TAU成功流程 1.1 空闲态TAU 1.2 连接态TAU 2. TAU失败流程 当UE进入一个小区&#xff0c;该小区所属TAI不在UE保存的TAI list内时&#xff0c;UE发起正常TAU流程&#xff0c;分为IDLE和CONNECTED&#xff08;即切换时&#xff09;下。如果TAU accept分配了一个新的…

web自动化(5)——关键字驱动

PO 模型会增加测试脚本的编写复杂度&#xff0c;尤其是当测试项目规模较大或者业务逻辑较为复杂时&#xff0c;需要编写大量的 Page Object 类&#xff0c;或者一旦我们的项目发生变动甚至更换项目时&#xff0c;就需要大量修改原来的代码&#xff0c;增加了项目的维护成本。关…

合并数组或对象的几种方法

1.两个数组对象合入一起 const cc [{id: 1,age: 80岁,name: 444,},{id: 1,age: 804岁,name: 2,},{id: 1,age: 803岁,name: 3,},{id: 1,age: 830岁,name: 33,},{id: 1,age: 1022220岁,name: 白龙马111111111,}, ] const reslutList [{id: 1,age: age,name: 唐曾,},{id: 1,age…

windows无命令升级降级node版本

1. node最新版本下载链接 点击最新下载链接&#xff0c;找到对应版本下载并解压 2. 通过命令where node找到node.exe位置 3. 将该位置的node.exe替换为下载解压的最新node.exe 4. 重新执行node -v查看版本 --------------------------------------------------------------…

论文解读:A New CNN Building Block for Low-ResolutionImages and Small Objects

引言 之前通过stride和pooling这些下采样操作&#xff0c;但是这些操作都会或多或少丢失图像的信息&#xff0c;所以这不适用于具有低分辨率图像和小物体的更困难的任务上。像池化选择maxpooling或者是averagepooling、卷积的步长(太大的话会丢失信息)都是很头疼的问题&#x…

QT登录功能开发

登录功能 1选择无按钮的dialog 2登录函数 #include <QApplication> #include <QDialog> #include <QFormLayout> #include <QLineEdit> #include <QPushButton> #include <QMessageBox>class LoginDialog : public QDialog { public:Log…

Axure软件大全:原型设计下载与学习指南!

Axure可以有效地创建原型&#xff0c;包括绘制APP和网页的原型图、框架图、结构图等。Axure内置的小部件可以用来构建动态交互。即使新手设计师不懂程序代码&#xff0c;也可以在Axure中创建复杂、动态、功能丰富的原型。对于想要深入研究和花时间学习程序的设计师来说&#xf…

LeetCode74二分搜索优化:二维矩阵中的高效查找策略

题目描述 力扣地址 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…