精华内容
下载资源
问答
  • wav音频文件

    2018-11-29 13:11:30
    wav音频文件 1k 10k 20khz
  • WAV音频文件

    千次阅读 2017-11-11 20:40:53
    WAV是一种保存音频信息的文件格式,广泛应用于Windows及其应用程序中,如今主流的音频播放器都支持WAV音频文件的播放。

    WAV音频文件

    象棋小子    1048272975

    WAV是一种保存音频信息的文件格式,广泛应用于Windows及其应用程序中,如今主流的音频播放器都支持WAV音频文件的播放。

    1. WAV音频格式

    WAV是录音时用的标准Windows文件格式,文件扩展名为”.wav”,数据本身的格式为PCM或压缩型,它是由微软与IBM联合开发的用于音频数字存储的标准,采用RIFF文件格式结构。

    RIFF全称资源互换文件格式,是Windows下大部分多媒体文件遵循的一种文件结构,除了本文所说的波形格式数据(.wav),采用RIFF格式结构的文件还有音频视频交错格式(.avi)、位图格式(.rdi)、MIDI格式(.rmi)、调色板格式(.pal)、多媒体电影(.rmn)、动画光标(.ani)。

    RIFF结构的基本单元为chunk,每个chunk必须包含一个4字节的chunk id,一个4字节的数据大小和对应的chunk数据。它的结构如下:

    struct chunk {

    unsigned int  id; /*  块标志 */

    unsignedint  size; /* 块大小*/

    unsigned chardata[size]; /* 块内容 */

    }

    id为4个ascii字符组成,用来识别块中所包含的数据,如”RIFF”、”WAV ”、”data”、”fmt ”等,size是存储在data域中数据的长度,不包括id与size域的大小,data[size]为该块保存的数据,以字为单位排列。

    WAV音频文件作为RIFF结构,其由若干个chunk组成,按照在文件中的位置包括:RIFF chunk,fmt chunk,fact chunk(可选),data chunk。所有RIFF结构文件均会首先包含RIFF chunk,并指明RIFF类型,此处为”WAVE”。WAV文件在fmt chunk中指明音频格式信息,例如采样位数、采样频率、声道数、编码方式等。对于压缩型WAV音频,如ADPCM、A律、U律等等,还会有一个fact chunk,用以指明解压后音频数据的大小,对于PCM非压缩WAV文件,并没有该chunk。音频数据保存在data chunk中,根据fmt chunk中指明的声道数以及采样位数,WAV音频数据存放形式有不同的方式。

    一个简单的PCM格式WAV结构定义如下:

    #define PCM_WAVE_FORMAT 1

    typedef struct RIFF_HEADER {

           charRiffId[4];

           uint32_tRiffSize;

           charRiffFormat[4];

    } RIFF_HEADER;

     

    typedef struct WAVE_FORMAT {

           uint16_tFormatTag; //声音的格式代号

           uint16_tChannels; //声音通道

           uint32_tSamplesPerSec; //采样率

           uint32_tAvgBytesPerSec; //采样率*块对齐单位

           uint16_tBlockAlign; //块对齐单位=每个取样所需位数*声音通道/8

           uint16_tBitsPerSample; //每个取样所需位数

    } WAVE_FORMAT;

     

    typedef struct FMT_CHUNK {

           charFmtID[4];

           uint32_tFmtSize;

           WAVE_FORMATWaveFormat;

    } FMT_CHUNK;

     

    typedef struct DATA_CHUNK {

           charDataId[4];

           uint32_t  DataSize;

    } DATA_CHUNK;

     

    typedef struct WAVE_HEADER {

           RIFF_HEADERRiffHeader;

           FMT_CHUNK  FmtChunk;

           DATA_CHUNK       DataChunk;

    } WAVE_HEADER;

     

    static WAVE_HEADER WaveHeader = {

           'R','I', 'F', 'F',

           0,

           'W','A', 'V', 'E',

           'f','m', 't', ' ',

           16,

           PCM_WAVE_FORMAT,// PCM编码

           1, // 单声道

           0,// 采样率初始化0

           0,// 每秒字节流初始化0

           2,// 每个采样2字节

           16,// 采样16位

           'd','a', 't', 'a',

           0

    };

    2、WAV音频播放

    WAV音频的播放涉及到音频驱动、SD卡读写文件的实现,可以参考前面的章节。播放实现主要流程如下:

    a.   用f_open()打开SD卡里的WAV文件。

    b.   用Wave_ReadHeader()函数解析WAV头,获取采样位数、采样频率、声道数等等音频格式,此处只支持PCM 16位音频格式。

    int Wave_ReadHeader(FIL *File,WAVE_FORMAT *WaveFormat)

    {

    uint32_t ByteRead;

    int DataBytes;

    char Buffer[512];

    char *pBuffer;

          

    if (f_lseek(File, 0) != RES_OK) {

           return-1;

    }

    if (f_read(File, Buffer, sizeof(Buffer),&ByteRead) != RES_OK) {

           return-2;

    }

    if (!Wav_FindChunk(Buffer,"RIFF", sizeof(Buffer))) {

           return-3;

    }

    if (!Wav_FindChunk(Buffer,"WAVE", sizeof(Buffer))) {

           return-4;

    }

    pBuffer = Wav_FindChunk(Buffer,"fmt ", sizeof(Buffer));

    if (!pBuffer) {

           return-5;

    }

    pBuffer += 8; // Move past "fmt", fmt size

    memcpy(WaveFormat, pBuffer,sizeof(WAVE_FORMAT));

    if (WaveFormat->FormatTag !=PCM_WAVE_FORMAT) {

           return-6;

    }

    pBuffer = Wav_FindChunk(Buffer,"data", sizeof(Buffer));

    if (!pBuffer) {

           return-7;

    }

    pBuffer += 4; // Move past"data"

    memcpy(&DataBytes, pBuffer,sizeof(uint32_t));

    if (WaveFormat->BitsPerSample != 16){

           return-8;

    }

    return DataBytes;

    }

    c.   根据解析的音频格式,对I2S音频驱动初始化。

    PRINTF("Playing %s\r\n",WavFilesList[FileIndex]);

    PRINTF("Mode: %s\r\n",WaveFormat.Channels==1?"Mono":"Stereo");

    PRINTF("Samplerate: %dHz\r\n", WaveFormat.SamplesPerSec);

    PRINTF("Bitrate: %d bps\r\n",WaveFormat.AvgBytesPerSec*8);

    PRINTF("Samples: %d\r\n",DataBytes / WaveFormat.BlockAlign);

    I2S_SetSamplerate(WaveFormat.SamplesPerSec);

    I2S_TxStart();

    d.   采用双缓存(缓存0和缓存1)实现SD卡音频数据的不断读取,当任一个缓存空的时候,用f_read()从SD卡读取音频数据到空缓存中,如果缓存满,则等待音频帧数据播放完,然后把缓存中的数据清空到音频输出流中。

    if (Playing &&(!BufferState.Buffer0Full || !BufferState.Buffer1Full)) {

           Res= f_read(&file, BufferState.Buffer[BufferState.WriteIndex],sizeof(BufferState.Buffer[0]), &ByteRead);

           if(Res != RES_OK) {

                  f_close(&file);

                  PRINTF("Readdata error\r\n");

                  State= 0;

                  break;   

           }

           if(ByteRead < sizeof(BufferState.Buffer[0])) {

                  f_close(&file);// 文件结束

                  Playing= 0; // 结束播放

           }

           if(BufferState.WriteIndex) {

                  BufferState.Buffer1Full= 1;

                  BufferState.WriteIndex= 0;

           }else {

                  BufferState.Buffer0Full= 1;

                  BufferState.WriteIndex= 1;

           }

    }

    SD卡读取的音频数据需要不断加载到音频输出缓存中,实现音频的连续播放。当I2S音频输出流播放完一帧后,就可以从准备好数据的双缓存中加载一帧的音频数据到输出帧中,直到这一缓存加载完,置缓存空,告知SD卡可以读取数据到这个空缓存。

    if (WriteIndex != I2SState.TxReadIndex){

    if (BufferState.ReadIndex <BUFFER_NUM*2) {

           if(!BufferState.Buffer0Full) {

                  break;

           }

    } else {

           if(!BufferState.Buffer1Full) {

                  break;

           }

    }

                 

    pBuffer = (int16_t *)BufferState.Buffer+ AUDIO_FRAME_SIZE*BufferState.ReadIndex;

    if (WaveFormat.Channels == 1) {

           for(i=0; i<AUDIO_FRAME_SIZE; i++) {

                  I2SState.TxBuffer[I2SState.TxWriteIndex][i]= ((int16_t *)pBuffer)[i];

           }

           TotalSize+= AUDIO_FRAME_SIZE * sizeof(int16_t);

           BufferState.ReadIndex++;

    } else {

           for(i=0; i<AUDIO_FRAME_SIZE; i++) {

                  I2SState.TxBuffer[I2SState.TxWriteIndex][i]= ((int32_t *)pBuffer)[i];

           }

           TotalSize+= AUDIO_FRAME_SIZE * sizeof(int32_t);

           BufferState.ReadIndex+= 2;

    }

                               

    if (BufferState.ReadIndex ==BUFFER_NUM*2) {

           BufferState.Buffer0Full= 0;

    } else if (BufferState.ReadIndex ==BUFFER_NUM*4) {

           BufferState.Buffer1Full= 0;

           BufferState.ReadIndex= 0;

    }

     

    I2SState.TxWriteIndex = WriteIndex;

    if (WriteIndex >=AUDIO_NUM_BUFFERS-1) {

           WriteIndex= 0;

    } else {

           WriteIndex++;

    }

                               

    if (!Playing) {

           if(TotalSize >= DataBytes) {

                  I2S_TxStop();

                  PRINTF("Play over\r\n");

                  State = 0;

           }

    }

    }

    3、WAV音频录制

    WAV音频的录制涉及到数字麦克风驱动、SD卡读写文件的实现,可以参考前面的章节。录音实现主要流程如下:

    a.   用f_open()创建SD卡里的WAV录音文件。

    b.   用f_lseek()开始从音频数据位置开始写入数据。16K采样率、单声道初始化数字麦克风。

    if (f_lseek(&file,sizeof(WAVE_HEADER)) != RES_OK) {

           f_close(&file);

           State= 0;

           break;

    }

    PRINTF("Recordingsound.wav\r\n");

    PRINTF("Mode: Mono\r\n");

    PRINTF("Samplerate: 16000Hz\r\n");

    PRINTF("Bitrate: %d bps\r\n",16000*2*8);

    Dmic_Start();

    c.   不断把麦克风录制的帧数据保存到空的双缓存中,当某一缓存填充满的时候,置位相应的缓存通道,告知SD卡可以把这一缓存通道的数据写入后清空。

    if(DmicState.Event) {

    pBuffer = (int16_t *)BufferState.Buffer+ AUDIO_FRAME_SIZE*BufferState.WriteIndex;

    for (i=0; i<AUDIO_FRAME_SIZE; i++) {

           ((int16_t*)pBuffer)[i] = DmicState.Buffer[DmicState.ReadIndex][i];

    }

    BufferState.WriteIndex++;

    if (BufferState.WriteIndex ==BUFFER_NUM*2) {

           BufferState.Buffer0Full= 1;

    } else if (BufferState.WriteIndex == BUFFER_NUM*4){

           BufferState.Buffer1Full= 1;

           BufferState.WriteIndex= 0;

    }

    if(DmicState.ReadIndex >=AUDIO_NUM_BUFFERS-1) {

    DmicState.ReadIndex=0;

    }else {

    DmicState.ReadIndex++;

    }

    DmicState.Event= 0;

    }

    用双缓存不断把录制的音频数据写入到SD卡,当双缓存中的某一缓存填充满,用f_write()把音频数据写入到SD卡,并清空这一缓存,告知麦克风可以把录制帧数据保存到这一空缓存中。

    if ((BufferState.Buffer0Full ||BufferState.Buffer1Full)) {

           Res= f_write(&file, BufferState.Buffer[BufferState.ReadIndex],sizeof(BufferState.Buffer[0]), &ByteWrite);

           if(Res != RES_OK) {

                  Dmic_Stop();

                  f_close(&file);

                  PRINTF("Writedata error\r\n");

                  State= 0;

                  break;   

           }

           if(BufferState.ReadIndex) {

                  BufferState.Buffer1Full= 0;

                  BufferState.ReadIndex= 0;

           }else {

                  BufferState.Buffer0Full= 0;

                  BufferState.ReadIndex= 1;

           }

           DataBytes += sizeof(BufferState.Buffer[0]);

    }

    d.   结束录制(通过按键)后,根据实际录制的音频数据大小,通过Wave_WriteHeader()更新WAV文件头。

    int Wave_WriteHeader(FIL *File, uint32_tSamplerate, uint32_t DataBytes)

    {

    uint32_t ByteWrite;

    if (f_lseek(File, 0) != RES_OK) {

           return-1;

    }

    WaveHeader.FmtChunk.WaveFormat.SamplesPerSec= Samplerate;

    WaveHeader.FmtChunk.WaveFormat.AvgBytesPerSec= Samplerate * 2;

    WaveHeader.DataChunk.DataSize =DataBytes;

    WaveHeader.RiffHeader.RiffSize =DataBytes + sizeof(WaveHeader) - 8;

    if (f_write(File, (uint8_t*)&WaveHeader, sizeof(WaveHeader), &ByteWrite) != RES_OK) {

           return-2;

    }

    return 0;

    }

    4. 附录

    MDK工程,包含SD卡文件读写代码,I2S、数字麦克风音频录制播放驱动,WAV音频文件播放、录制的实现。

    https://pan.baidu.com/s/1c6kxdk

     

    展开全文
  • wav音频文件 测试文件

    2017-05-28 12:19:29
    wav音频文件,供测试用
  • 0-9阿拉伯数字的wav音频文件,声音清晰,每个数字播放时间也很短
  • pcm音频文件和wav音频文件 工具下载

    热门讨论 2017-05-02 21:20:18
    用来测试的pcm音频文件,和wav音频文件。 有对应的三对wav和pcm一一对应
  • 阿拉伯数字的wav音频文件,wav是数字音频文件格式
  • c# 调用音频设备录音、语音播报、文本转Wav音频文件Wav音频文件转文本(语音识别) 用到的动态库 SpeechLib、Microsoft.DirectX、Microsoft.DirectX.DirectSound
  • 0-9阿拉伯数字的wav音频文件,声音清晰,每个数字播放时间也很短
  • 阿拉伯数字的wav音频文件,wav是数字音频文件格式吗源码.zip
  • 主要介绍了PowerShell中实现播放WAV音频文件,本文直接给出实现代码,需要的朋友可以参考下
  • STM32使用PWM播放WAV音频文件,使用fatfs文件系统,wav音频文件存放在sd卡中
  • wav音频文件格式

    千次阅读 2019-07-14 20:14:49
    在做音频信号采集或音频信号...RIFF是一种带标签的文件结构,其可以定义许多文件格式,比如wav音频文件格式。RIFF文件由块结构组成,块结构由3个部分组成,分别为块ID、块大小、块数据,其中块ID由4字节组成,用于...

     

    在做音频信号采集或音频信号分析时会经常遇到wav格式的文件,本章将介绍wav文件的格式。wav是基于资源交换文件格式(RIFF(Resource Interchange File Format))的应用之一。RIFF是一种带标签的文件结构,其可以定义许多文件格式,比如wav音频文件格式。RIFF文件由块结构组成,块结构由3个部分组成,分别为块ID、块大小、块数据,其中块ID由4字节组成,用于描述块数据;块大小由32位无符号整形数据表示,其只计算块数据的大小,不包含块ID和块大小的长度;块数据由字节数组组成,其采用小端格式,但其是双字节对齐的,当块大小为奇数个时,需要在数据后面补充一个字节。块数据用C代码表示如下所示:

    typedef struct

    {

             uint8_t ckID[4];

             uint32_t ckSize;

             uint8_t ckData[CKSIZE];

    }CK;

     

    wave文件格式如下所示:

    其中WAVE chunks由一些WAVE的子块数据组成,比如fmt块、data块。

     

    fmt块:

             fmt块携带着wav音频文件重要信息,比如采样率,采样点的数据大小等等,其结构如下所示:

    可以看出fmt的块大小cksize值有3个,分别为16、18、40,这取决于wFormatTag的值,当wFormatTag = 0x0001(WAVE_FORMAT_PCM),即PCM格式,cksize = 16;当wFormatTag = 0xFFFE(WAVE_FORMAT_EXTENSIBLE),即扩展格式,cksize = 40;wFormatTag为其他值时,即非PCM格式,cksize = 18。

     

    data块:

             data块包含了采集的音频数据,其结构如下所示:

    注意当cksize为奇数时,需要往sampled data后面补齐一个空字节的值(0x00)。

     

    举例:

             由于大多数实验采集和分析的是PCM格式的wav文件,因此下面将介绍PCM格式的wav文件,如下所示:

    其中Nc 为通道数;Ns为块的数目,一个块由Nc个采样组成;M为每个采样数据的字节长度;F为采样速率(块/秒)。

     

    wav格式代码解析

             由如上举例,我们可以清楚的知道wav文件具体的格式,通常在存储wav数据到U盘或SD卡时,要先预设cksize字段的值,然后根据实际存储到U盘或SD卡的数据来更新cksize字段的值。代码待续。。。

     

    展开全文
  • WAV音频文件读写,使用智能指针,支持自增音频文件,一小时新建一个文件,声道数、采样率、量化位数默认为1,12500,16
  • 从文件夹中载入wav音频文件,根据音频文件绘制出相应的melspectrogram
  • java对wav音频文件头分析代码,解析wav音频文件的组成部分以及每个部分的相应的值和类型
  • wav音频文件转换为sbc音频文件

    千次阅读 2019-08-29 11:13:39
    当我们得到一个双声道的wav音频文件,要将它转换为sbc后缀的文件操作: 第一步,需要将其转换为单声道的文件: ①:打开Cool Edit Pro 2.1,将音频文件拖入其中; ②:将鼠标移动到最上面或者最下面,鼠标旁边会出现...

    当我们得到一个双声道的wav音频文件,要将它转换为sbc后缀的文件操作:

    第一步,需要将其转换为单声道的文件:
    ①:打开Cool Edit Pro 2.1,将音频文件拖入其中;
    ②:将鼠标移动到最上面或者最下面,鼠标旁边会出现“L”或者“R”的提示;
    ③:鼠标左击选中,然后右键选择“复制为新的”,就会生产一个新的单声道的文件;
    ④:另存为,后缀还是选择为wav,然后保存即可生产单声道的wav文件。

    第二步:将采样率设置为16000:
    ①:打开格式工厂,并将生产的单声道wav音频文件拖入,转换为mp3格式;
    ②:双击任务,然后将采样率设置为16000;
    ③:开始任务,就会生成指定的mp3文件,这个mp3文件即为采样率为16000的音频文件。

    第三步:将mp3文件转换为wav文件:
    ①:打开Cool Edit Pro 2.1,并将mp3文件拖入其中;
    ②:点击另存为,将格式选择为Windows PCm(*.wav),即可,然后保存,压缩就完成了。

    第四步:生成sbc后缀的文件:
    ①:在转换工具sbc.exe下创建一个文件夹wav,然后将压缩后的wav文件放到这个文件夹中;
    ②:双击sbc.exe,会自动生成一个sbc的文件夹,里面就是转换完成之后的文件。

    第五步:替换SDK下的音频文件:
    ①:将生成的sbc文件替换projects\earphone\Output\bin\res\下文件夹中的sbc文件,记得将名字也修改为对应的名字;
    ②:点击projects\earphone\Output\bin下的postbuild.bat和prebuild.bat;
    ③:将工程重新编译,生产最新的升级软件,升级即可。

    这样子就可以将软件中的提示音转换为指定的提示音了,有问题或者有建议的小伙伴可以添加我的个人微信 lqy—1997 (中间是三个英文的杠)或者留言进行交流。

    展开全文
  • 主要介绍了Python 读取WAV音频文件 画频谱的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 内容索引:VB源码,多媒体技术,播放器,音频播放,WAV VB播放wav音频文件并显示波形,这个程序是个示例,代码介绍了基本原理和方法,显示波形部分还有些小问题,另外对WAV文件要求比较苛刻,需要标准的WAV文件。
  • 测试用的0DB WAV音频文件 1KHz-stero 10KHz-stero 20Hz-stero
  • 主要介绍了C++读取WAV音频文件的头部数据的实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的方法,需要的朋友可以参考下
  • 测试用的0DB WAV音频文件00-200Hz Stereo 0dB,01-300Hz Stereo 0dB,1kHz Stereo 0dB,2kHz Stereo 0dB,03-500Hz Stereo 0dB
  • 主要介绍了java实现切割wav音频文件的方法,结合实例形式详细分析了java切割wav音频文件的相关原理、操作技巧与注意事项,并附带外部jar包供读者下载,需要的朋友可以参考下
  • 0-9高清 wav 音频文件

    2018-07-11 14:44:21
    高清的0-9阿拉伯数字的wav音频文件,找了很久才找到的,每个数字播放时间也很短
  • # brief : 播放wav音频文件 import wave from pyaudio import PyAudio import sys def player(filename): chunk = 1024 wf = wave.open(filename, 'rb') p = PyAudio() stream = p.open(format=p.get_format_f
  • VB 播放wav音频文件 并显示波形 VB播放wav音频文件并显示波形,这个程序是个示例,代码介绍了基本原理和方法,显示波形部分还有些小问题,另外对WAV文件要求比较苛刻,需要标准的WAV文件。
  • 仅支持16bit位宽、单声道的wav音频文件 用途:音频噪声规避辅助分析、音频各精度(位宽)效果对比、辅助教学等 用法:把要分析的wav格式音频文件修改为in.wav,放在本工具同一个文件夹下,运行本工具,输入需要保留...
  • 16kHz, 16bit, 双通道立体声wav音频文件,用于调试声卡时使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,765
精华内容 13,906
关键字:

wav音频文件