wav音频文件格式解析【个人笔记】(自用)

2023-11-10

目录


回到顶部

1. WAV格式

wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些。、

支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器
通常使用三个参数来表示声音量化位数,取样频率和采样点振幅量化位数分为8位,16位,24位三种,声道单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种,不过尽管音质出色,但在压缩后的文件体积过大!相对其他音频格式而言是一个缺点,其 文件大小的计算方式为:WAV格式文件所占容量(B) = (取样频率 X量化位数X 声道) X 时间 / 8 (字节= 8bit) 每一分钟WAV格式的音频文件的大小为10MB,其大小不随音量大小及清晰度的变化而变化

注:专业名词(取样频率、量化位数、声道)解释:https://blog.csdn.net/eric88/article/details/17098603 

  • 采样位数:也叫量化位数(单位:比特),是存储每个采样值所用的二进制位数。采样值反应了声音的波动状态。采样位数决定了量化精度。采样位数越长,量化的精度就越高,还原的波形曲线越真实,产生的量化噪声越小,回放的效果就越逼真。常用的量化位数有4、8、12、16、24。量化位数与声卡的位数和编码有关。

  • 采样频率:采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。越高所能描述的声波频率就越高。采样率决定声音频率的范围(相当于音调),可以用数字波形表示。以波形表示的频率范围通常被称为带宽。要正确理解音频采样可以分为采样的位数和采样的频率。 

  • 声道数:  使用的声音通道的个数,也是采样时所产生的声音波形的个数。播放声音时,单声道的WAV一般使用一个喇叭发声,立体声的WAV可以使两个喇叭发声。记录声音时,单声道,每次产生一个波形的数据,双声道,每次产生两个波形的数据,所占的存储空间增加一倍。
  • WAV格式大小:采样率一般是44.1K,16bit采样精度,存储成WAV格式大小 = 44.1KHz(采样率) X 16bit(采样位数) X 2(双声道) X  播放时间

  • WAV格式是没有压缩无损的,MP3格式是按1:12压缩保存的,所以MP3格式大小等于上式的1/12。

为什么还要用wav来做示例呢?这是因为WAV本质上是无压缩的原始音频文件,而且他的文件结构不算非常复杂,因此可以作为我们初学者的学习示例格式。

回到顶部

2. WAV的二进制格式解析

WAV文件格式分析:https://blog.csdn.net/zhihu008/article/details/7854529

  • 大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF。例如声音的WAV文件

  • RIFF:可以看做是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由 "辨别码"、"数据大小"及"数据" 所组成。

2.1 WAV文件格式

  • WAVE文件是非常简单的一种RIFF文件,它的格式类型为"WAVE"。RIFF块包含两个子块,这两个子块的ID分别是 "fmt" 和 "data",其中 "fmt" 子块由结构PcmWaveFormat所组成,其子块的大小就是sizeof(PcmWaveFormat),数据组成就是PcmWaveFormat结构中的数据。

图三、WAVE文件结构 

复制代码

typedef struct WAV_RIFF {
    /* chunk "riff" */
    char ChunkID[4];     /* "RIFF" */
    /* sub-chunk-size */
    uint32_t ChunkSize;  /* 36 + Subchunk2Size */
    /* sub-chunk-data */
    char Format[4];      /* "WAVE" */
} RIFF_t;

typedef struct WAV_FMT {
    /* sub-chunk "fmt" */
    char Subchunk1ID[4];    /* "fmt " */
    /* sub-chunk-size */
    uint32_t Subchunk1Size; /* 16 for PCM */
    /* sub-chunk-data */
    uint16_t AudioFormat;   /* PCM = 1*/
    uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */
    uint32_t SampleRate;    /* 8000, 44100, etc. */
    uint32_t ByteRate;      /* = SampleRate * NumChannels * BitsPerSample/8 */
    uint16_t BlockAlign;    /* = NumChannels * BitsPerSample/8 */
    uint16_t BitsPerSample; /* 8bits, 16bits, etc. */
} FMT_t;

typedef struct WAV_data {
    /* sub-chunk "data" */
    char Subchunk2ID[4];    /* "data" */
    /* sub-chunk-size */
    uint32_t Subchunk2Size; /* data size */
    /* sub-chunk-data */
//    Data_block_t block;
} Data_t;

//typedef struct WAV_data_block {
//} Data_block_t;

typedef struct WAV_fotmat {
    RIFF_t riff;
    FMT_t fmt;
    Data_t data;
} Wav;

复制代码

  • "data"子块包含WAVE文件的数字化波形声音数据,其存放格式依赖于"fmt"子块中SubchunkID,  SubchunkSize ,AudioFormat 成员指定的格式种类,在多声道WAVE文件中,样本是交替出现的。如16bit的单声道WAVE文件和双声道WAVE文件的数据采样格式分别如图四所示: 

 图四、WAVE文件数据采样格式

2.2 C语言解析wav文件

wave.h

复制代码

//
// Created by douzi on 19-3-26.
//

#ifndef RESOLVE_WAV_WAVE_H
#define RESOLVE_WAV_WAVE_H

#include <cstdint>

typedef struct WAV_RIFF {
    /* chunk "riff" */
    char ChunkID[4];     /* "RIFF" */
    /* sub-chunk-size */
    uint32_t ChunkSize;  /* 36 + Subchunk2Size */
    /* sub-chunk-data */
    char Format[4];      /* "WAVE" */
} RIFF_t;

typedef struct WAV_FMT {
    /* sub-chunk "fmt" */
    char Subchunk1ID[4];    /* "fmt " */
    /* sub-chunk-size */
    uint32_t Subchunk1Size; /* 16 for PCM */
    /* sub-chunk-data */
    uint16_t AudioFormat;   /* PCM = 1*/
    uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */
    uint32_t SampleRate;    /* 8000, 44100, etc. */
    uint32_t ByteRate;      /* = SampleRate * NumChannels * BitsPerSample/8 */
    uint16_t BlockAlign;    /* = NumChannels * BitsPerSample/8 */
    uint16_t BitsPerSample; /* 8bits, 16bits, etc. */
} FMT_t;

typedef struct WAV_data {
    /* sub-chunk "data" */
    char Subchunk2ID[4];    /* "data" */
    /* sub-chunk-size */
    uint32_t Subchunk2Size; /* data size */
    /* sub-chunk-data */
//    Data_block_t block;
} Data_t;

//typedef struct WAV_data_block {
//} Data_block_t;

typedef struct WAV_fotmat {
    RIFF_t riff;
    FMT_t fmt;
    Data_t data;
} Wav;


#endif //RESOLVE_WAV_WAVE_H

复制代码

  • uint8_t:  unsigned char

  • uint16_t:unsigned short int

  • uint32_t:unsigned int

  • uint64_t: unsigned long int

wave.cpp

复制代码

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wave.h"

int main()
{
    FILE *fp = NULL;

    Wav wav;
    RIFF_t riff;
    FMT_t fmt;
    Data_t data;

    fp = fopen("/home/douzi/Douzi_qdreamer/resolve_wav/mbfio_mic3.wav", "rb");
    if (!fp) {
        printf("can't open audio file\n");
        exit(1);
    }

    fread(&wav, 1, sizeof(wav), fp);

    riff = wav.riff;
    fmt = wav.fmt;
    data = wav.data;

    /**
     *  RIFF
     */
    printf("ChunkID \t\t%c%c%c%c\n", riff.ChunkID[0], riff.ChunkID[1], riff.ChunkID[2], riff.ChunkID[3]);
    printf("ChunkSize \t\t%d\n", riff.ChunkSize);
    printf("Format \t\t\t%c%c%c%c\n", riff.Format[0], riff.Format[1], riff.Format[2], riff.Format[3]);

    printf("\n");

    /**
     *  fmt
     */
    printf("Subchunk1ID \t%c%c%c%c\n", fmt.Subchunk1ID[0], fmt.Subchunk1ID[1], fmt.Subchunk1ID[2], fmt.Subchunk1ID[3]);
    printf("Subchunk1Size \t%d\n", fmt.Subchunk1Size);
    printf("AudioFormat \t%d\n", fmt.AudioFormat);
    printf("NumChannels \t%d\n", fmt.NumChannels);
    printf("SampleRate \t\t%d\n", fmt.SampleRate);
    printf("ByteRate \t\t%d\n", fmt.ByteRate);
    printf("BlockAlign \t\t%d\n", fmt.BlockAlign);
    printf("BitsPerSample \t%d\n", fmt.BitsPerSample);

    printf("\n");

    /**
     *  data
     */
    printf("blockID \t\t%c%c%c%c\n", data.Subchunk2ID[0], data.Subchunk2ID[1], data.Subchunk2ID[2], data.Subchunk2ID[3]);
    printf("blockSize \t\t%d\n", data.Subchunk2Size);

    printf("\n");

//    duration = Subchunk2Size / ByteRate
    printf("duration \t\t%d\n", data.Subchunk2Size / fmt.ByteRate);

}

复制代码

回到顶部

3. WAV文件语音数据的组织结构

参考:https://www.cnblogs.com/ranson7zop/p/7657874.html

WAV文件的声音数据保存在数据块中。块标识符为“data”块长度值为声音数据的长度

从数据块的第9个字符开始是声音波形采样数据。每个样本按采样的时间先后顺序写入。样本的字节数取决于采样位数。对于多字节样本低位字节数据 放在低地址单元,相邻的高位字节数据放在高地址单元。多声道样本数据采用交替方式存储。例如: 立体声(双声道)采样值的存储顺序为:

  • 通道1第1采样值, 通道2第1采样值;通道1第2采样值, 通道2第2采样值;以此类推。基于PCM编码的样本数据排列方式。

(1)“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
(2)“22 60 28 00”,这个是我这个WAV文件的数据大小,这个大小包括除了前面4个字节的所有字节,也就等于文件总字节数减去8。16进制的“22 60 28 00”对应是十进制的“2646050”。
(3)“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
以后是PCMWAVEFORMAT部分

(4)“12 00 00 00”,这是一个DWORD,对应数字18,这个对应定义中的PCMWAVEFORMAT部分的大小,可以看到后面的这个段内容正好是18个字节。一般情况下大小为16,此时最后附加信息没有,上面这个文件多了两个字节的附加信息。
(5)“01 00”,这是一个WORD,对应定义为编码格式(WAVE_FORMAT_PCM格式一般用的是这个)。
(6)“01 00”,这是一个WORD,对应数字1,表示声道数为1,是个单声道Wav。
(7)“22 56 00 00”对应数字22050,代表的是采样频率22050,采样率(每秒样本数),表示每个通道的播放速度
(8)“44 AC 00 00”对应数字44100,代表的是每秒的数据量,波形音频数据传送速率,其值为:通道数×每秒样本数×每样本的数据位数/8(1*22050*16/8。播放软件利用此值可以估计缓冲区的大小。
(9)“02 00”对应数字是2,表示块对齐的内容。数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
(10)“10 00”数值为16,采样大小为16Bits,每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
(11)“00 00”此处为附加信息(可选),和(4)中的size对应。

(12)“66 61 73 74” Fact是可选字段,一般当wav文件由某些软件转化而成,则包含该项,“04 00 00 00”Fact字段的大小为4字节,“F8 2F 14 00”是fact数据。

(13)“64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
(14)“F0 5F 28 00”十六进制数是“0x285ff0”,对应十进制2646000,是数据区的开头,以后数据总数,看一下前面正好可以看到,文件大小是2646050,从(2)到(13)包括(13)正好是2646050-2646000=50字节。

回到顶部

4. 总结

对WAV格式影响最大的参数是编码格式。采用不同的编码的WAV格式是不同的,PCM是最常见的编码格式,其它的为压缩编码格式,一般很少使用,有的已经废弃。随着人们认识的进步可能还会有新的编码格式出现。今后对WAV文件格式的更多的研究是压缩编码格式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wav音频文件格式解析【个人笔记】(自用) 的相关文章

  • Mixing digital audio(混音数字音频),声音混合算法

    Mixing digital audio 大家可以看这篇文章Mixing digital audio
  • Python 从零开始制作自己的声音 - wave模块读写wav文件详解

    计算机经常被用于处理音频这种真实世界中的数据 声音经过采样 量化和编码后 存储在音频文件 如wav文件中 文章首先介绍wave模块的基础用法 再通过生成一定频率声波的算法实现 来深入讲解wave库的使用 目录 wave模块 wave ope
  • Thinkpad E450个性化设置:F1~F12恢复正常按键;Fn与Ctrl按键互换

    一 F1 F12恢复正常按键 联想Thinkpad E450的 F1 F12键 功能与其他笔记本是相反的 也就是说 如果不按着Fn 在那几个功能键 实现的是属性设置的功能 比如直接按下F1键是静音 F2键是音量降低 F3是音量增加等等 如果
  • java 下mp3 转 pcm、wav

    mp3 转 pcm wav 由于MP3直接转为wav 容易出现文件大小为0k 时间缩短等问题 这里是通过先将mp3转成pcm 然后在通过pcm转成wav 下面直接上代码 先引入所需要的jar包
  • win10系统谷歌浏览器怎么用不了?谷歌浏览器打不开网页的解决方法

    1 我们下载好谷歌浏览器后 搜索时 界面一直卡在主界面 一直在刷新 就是弹不出东西 2 通过设置来是谷歌浏览器可以进行搜索 点击右上角的三个小黑点 在下拉界面中点击 设置 3 在 地址了使用的搜索引擎 后面 点击Google后面的小三角 选
  • 区块链知识转载博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    注 这是本人读到的关于共识算法最全和最好的分享博文 系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法 原文链接请见后 目录 一 拜占庭容错技术 Byzantine Fault Tolerance BFT 二 PBFT Practi
  • 转:Cookie详解

    没怎么坐过客户端相关的工作 所以写爬虫的时候 很多概念都很模糊 学习起来很困难 现在想攻坚一下 所以找了一下cookies相关的内容 HTTP cookies 通常又称作 cookies 早期Web开发面临的最大问题之一是如何管理状态 服务
  • 转:脱字符"^"的由来

    从事IT业二十多年 今年才知道 这个符号叫脱字符 由于最近在学Python的re正则表达式处理 就查了下这个名称的由来 转发如下 脱字符 就是说 在文章中 某个字 打漏了 打脱了 打落了 要在这个中间 把打落了 的字 插入进去 就是使用的这
  • 转:Chrome浏览器查看网站登录 Cookie 信息的方法

    当我们使用自动签到等程序的时候一般都要用到网站Cookie 我们可以借助浏览器的扩展来获取Cookie信息 但其实通过浏览器本身的功能就可以查看Cookie信息 以Chrome类浏览器为例有以下三种方法 chrome浏览器 方法一 1 打开
  • 比较 android 中的语音 wav 或语音标签(语音命令)API

    我正在开发一个应用程序 我需要某种方法来比较两个语音是否匹配 我知道语音识别器是一种方法 但因为 我认为 它需要首先将语音转换为字符串 所以除了语音识别器支持的语言之外 不太适合其他语言 有什么想法吗 就像过去的电话一样 语音标签只是将语音
  • 如何将wav文件转换为浮动幅度

    所以我问了标题中的所有内容 我有一个 wav 文件 由 PyAudio 从输入音频编写 我想将其转换为与声级 振幅 相对应的浮点数据 以进行一些傅里叶变换等 有人有将 WAV 数据转换为 float 的想法吗 我已经找到了两种不错的方法来做
  • 同时从麦克风录制音频并在Python中播放效果

    我的目标是通过笔记本电脑麦克风录制我的声音 并同时在 python 中添加效果 我需要的是类似于音乐效果踏板 您可以在其中连接吉他或麦克风 并添加混响 回声或失真等 我正在使用 pyaudio 和 wave 来录制和播放音频 使用 scik
  • Android:使用Raw PCM创建Wave文件,Wave文件无法播放

    我已经为波形文件创建了标题 但创建的波形文件无法播放 我用过这个https ccrma stanford edu courses 422 projects WaveFormat https ccrma stanford edu course
  • 从任何音乐文件 ios 生成波形

    我正在寻找如何根据音乐绘制声波 我想要像这样的图片的波浪 这是一些关于显示音乐中的波浪的讨论 iOS 上的波形 https stackoverflow com questions 8298610 waveform on ios 在 iPho
  • 使用 PyDub 消除波形文件开头和结尾处的静音

    如何使用 PyDub 消除波形文件开头和结尾的静音 我想我应该逐段访问并检查它是否静音 但我无法做到 例如我有一个在开头 结尾或两者都有静音的波形文件 如下所示 我想删除文件开头和结尾的静音 例如我想导入它 sound AudioSegme
  • 如何从Python中的十六进制字符串中删除'\x'?

    我正在读一本wavPython 中的音频文件使用wave模块 这readframe 该库中的函数以十六进制字符串形式返回帧 我想删除 x这个字符串的 但是translate 功能无法按我想要的方式工作 gt gt gt input wave
  • 通过socket发送wav文件

    我正在尝试通过套接字发送 wav 文件 我收到错误 TypeError must be string or buffer not instance waveFile wave open WAVE OUTPUT FILENAME rb my
  • boto3 S3 对象解析

    我正在尝试编写一个 Python 脚本来处理存储在 S3 上的音频数据 我有一个 S3 对象 我正在使用它调用 def grabAudio filename directory obj s3client get object Bucket
  • AVAudioRecorder 未写出正确的 WAV 文件头

    我正在 iPhone 上开发一个项目 我使用 AVAudioRecorder 从设备麦克风录制音频 然后对录音进行操作 为了确保我正确地从文件中读取样本 我使用 python 的 wave 模块来查看它是否返回相同的样本 然而 当尝试打开
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio

随机推荐

  • (每日一练)MATLAB生成斐波那契数和数列

    今天 我学习的内容是利用MATLAB生成斐波那契数 先来介绍一下 斐波那契数列最初是用来解决兔子问题的 问题如下 一个人把一对兔子放在一个四面被墙包围的地方 假设每对兔子每个月都生一对新兔子 不 考虑伦理问题 那么一年可以从这对兔子中生产多
  • C/C++中__builtin_popcount()的使用及原理

    这个函数功能 返回输入数据中 二进制中 1 的个数 对于不同的使用类型 可以采用采用以下函数 builtin popcount int builtin popcountl long int builtin popcountll long l
  • Python列表推导式

    列表推导式 列表推导式使用非常简洁的方式来快速生成满足特定需求的列表 代码具有非常强的可读性 语法形式为 expression for expr1 in sequence1 if condition1 for expr2 in sequen
  • nginx之头部变量x_forwarded_for

    proxy add x forwarded for变量包含客户端请求头中的 X Forwarded For 与 remote addr两部分 他们之间用逗号分开 举个例子 有一个web应用 在它之前通过了2个nginx转发 即用户访问该we
  • P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

    题目描述 两只牛逃跑到了森林里 Farmer John 开始用他的专家技术追捕这两头牛 你的任务是模拟他们的行为 牛和 John 追击在10 10 的平面网格内进行 一个格子可以是 一个障碍物 两头牛 它们总在一起 或者 Farmer Jo
  • 如何有效使用渲染农场?防止渲染出错的7个方法!

    如何使用渲染农场 又如何有效地使用渲染农场 使用云渲染农场时出错怎么办 众所周知我们可以在任意的笔记本或者终端PC上面来创作 3ds Max 场景 但是实际渲染是这样吗 其实不然 这其中的差距不是一星半点 只能说很可能会有两种不同的呈现 而
  • HTML+CSS+JS列表式视频播放页面

    HTML CSS JS列表式视频播放页面 无插件 应该没有 效果图 html
  • 31 Qt 之绘图之绘制一个漂亮的圆及圆弧

    一 圆形 经常地 我们会在网上看到一些列的抽奖活动 里面就有圆盘抽奖 是不是有点手痒了O O 效果 void MainWindow paintEvent QPaintEvent QPainter painter this painter s
  • 三英战SQL:解析NoSQL的可靠性及扩展操作

    摘要 NoSQL的高性能 易扩展及可靠性一直深受数据工作者的喜爱 然而对比传统关系型数据库NoSQL的优势究竟又在何处 Esen Sagynov在DZone上发布了一篇文章 从运行方面分析Cassandra HBase以及MongoDB产品
  • SVN 执行清理命令,提示清理以下路径失败,并可能有乱码的解决方法

    SVN 执行清理命令 提示清理以下路径失败 并可能有乱码的解决方法 参考文章 1 SVN 执行清理命令 提示清理以下路径失败 并可能有乱码的解决方法 2 https www cnblogs com aidegongyang p 830374
  • Windows下MySQL安装配置及libmysql的使用

    Windows下MySQL安装配置及libmysql的使用 1 安装配置 请参考 Mysql安装配置 2 API文档 libmysql API文档地址 3 示例代码 本示例代码使用了mysql stmt xxx接口 运行本代码需要提前创建好
  • Python之科赫曲线绘制

    实验四 py import turtle def koch size n if n 0 turtle fd size else for angle in 0 60 120 60 turtle left angle koch size 3 n
  • graphpad做图如何加星号_如何用R画分组柱状图并且添加标准差和显著性标记(星号)?...

    时间过了这么久 该交一份答案了 ggplot2包 是一个图形可视化包 并不带统计分析功能 所以统计学分析需要另外去做 这里加bar和显著性标识 如果了解ggplot2绘图原理中的图层概念的话 就能明白 无非就是在画完分组柱状图后 根据需要自
  • PCL 计算点云中任意一个点的法向量

    目录 一 算法原理 1 原理概述 2 主要函数 二 代码实现 三 结果展示 一 算法原理 1 原理概述 见 PCL 计算点云法向量并显示 2 主要函数 inline bool computePointNormal const pcl Poi
  • 自定义user表签发token、自定义认证类、simpleui模块使用

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 今日内容概要
  • mysql的数据备份脚本

    一 数据库的备份脚本脚本命令 1 核心命令 usr local mysql bin mysqldump h IP p3306 u dbuser p dbpasswd f A F E R quick single transaction fl
  • Linux命令 - ls命令

    Linux命令 ls命令 ls命令是linux下最常用的命令 ls命令就是list的缩写 用来打印出当前目录的清单 如果ls指定其他目录 那么就会显示指定目录里的文件及文件夹清单 通过ls 命令不仅可以查看linux文件夹包含的文件 而且可
  • python多线程:Thread类的用法

    我们要创建Thread对象 然后让他们运行 每个Thread对象代表一个线程 在每个线程中我们可以让程序处理不同的任务 这就是多线程编程 创建Thread对象有两种方法 1 直接创建Thread 将一个callable对象从类的构造器传递出
  • 团体程序设计天梯赛-练习集(5分题)

    团体程序设计天梯赛 练习集 5分题 L1 001 Hello World 5 分 这道超级简单的题目没有任何输入 你只需要在一行中输出著名短句 Hello World 就可以了 输入样例 无 输出样例 Hello World public
  • wav音频文件格式解析【个人笔记】(自用)

    目录 1 WAV格式 2 WAV的二进制格式解析 2 1 WAV文件格式 2 2 C语言解析wav文件 3 WAV文件语音数据的组织结构 4 总结 回到顶部 1 WAV格式 wav是微软开发的一种音频文件格式 注意 wav文件格式是无损音频