精华内容
下载资源
问答
  • wav文件详解 WAV头分析 WAV是微软公司(Microsoft)开发的一种声音文件格式,在多媒体中使用的声波文件格式之一,它是以RIFF(Resource Interchange File Format 资源交互文件格式) 格式为标准的。每个WAV文件的头四个...

    wav文件详解

    1. WAV头分析

    WAV是微软公司(Microsoft)开发的一种声音文件格式,在多媒体中使用的声波文件格式之一,它是以RIFF(Resource Interchange File Format 资源交互文件格式) 格式为标准的。每个WAV文件的头四个字节就是“RIFF”。WAV文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分,文件头中还包含了音频流的编码参数。

    如下图所示

     

    //wav头

    typedef __packed struct

    {

      ChunkRIFF riff;   //riff块

      ChunkFMT fmt;     //fmt块

      ChunkFACT fact;   //fact块 线性PCM,没有这个结构体

      ChunkDATA data;   //data块     

    }__WaveHeader;

     

    WAV文件头包含三部分,RIFF,fmt,fact,数据存储大小端定义按上图中的定义,规律大概是这样的,如果是字符串常量,则按阅读习惯,采用大端存储模式,如果是十六进制数据的纯数据,则按一般处理器处理规律小端模式存储。

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

     

      1. RIFF结构如下,定义,

     typedef __packed struct

    {

        u32 ChunkID;        //chunk id;这里固定为"RIFF",即0X46464952

        u32 ChunkSize ;         //集合大小;文件总大小-8

        u32 Format;            //格式;WAVE,即0X45564157

    }ChunkRIFF ;

      1. fmt结构

    //fmt块

    typedef __packed struct

    {

        u32 ChunkID;          //chunk id;这里固定为"fmt ",即0X20746D66

        u32 ChunkSize ;       //子集合大小(不包括ID和Size);这里为:20.

        u16 AudioFormat;   //音频格式;0X01,表示线性PCM;0X11表示IMA ADPCM

      u16 NumOfChannels;      //通道数量;1,表示单声道;2,表示双声道;

      u32 SampleRate;         //采样率;0X1F40,表示8Khz

      u32 ByteRate;        //字节速率;

      u16 BlockAlign;         //块对齐(字节);

      u16 BitsPerSample;      //单个采样数据大小;4位ADPCM,设置为4

      u16 ByteExtraData;   //附加的数据字节;2个; 线性PCM,没有这个参数

      u16 sampleperblock;      //一般是一个数据块中的采样数量 如:0x01F9

    }ChunkFMT; 

    ByteExtraData这个数据重点说一下,在原始线性PCM编码格式,不需要这个参数,只有压缩的PCM编码格式,一般都是按块存储的,需要知道一个块内的采样数量。

      1. fact结构

     

    //fact块

    typedef __packed struct

    {

        u32 ChunkID;        //chunk id;这里固定为"fact",即0X74636166;

        u32 ChunkSize ;         //子集合大小(不包括ID和Size);这里为:4.

        u32 NumOfSamples;       //采样的数量;

    }ChunkFACT;

    All (compressed) non-PCM formats must have a Fact chunk (Rev. 3documentation). The chunk contains at least one value, the number of samples in the file.”

    虽然标准协议要求”所有非PCM编码的WAV文件要求有fact块”,但实际分析了两个wav文件的文件头,一种PCM编码,一种IMA-ADPCM编码,这两个文件都没有fact块,但是window可以正常播放;说明fact块对这两种类型的wav文件也不是必须的。

     

    1. 音频数据
      1. data结构

    //data块

    typedef __packed struct

    {

        u32 ChunkID;        //chunk id;这里固定为"data",即0X5453494C

        u32 ChunkSize ;      // 音频数据块大小。(除去WAV头的所有数据)

    }ChunkDATA;

      1. 数据块BLOCK结构

    IMA-ADPCM压缩的音频数据是以数据块存储的,存储格式如下:

    //ADPCM压缩的数据块结构

    typedef __packed struct

    {

        u16 presample;      //第一个采样值16bit

        u8 index ;          //上一个数据块的最后一个 index

        u8 rsv;             //保留

        u8 dat[sampleperblock-1];

    }DATA_BLOCK;

    为了数据存储对齐,方便处理,一般一个音频BLOCK的大小是16的整数倍;如果设置BLOCK大小为256Byte,减去数据块头长度4字节,还剩252字节,4bit表示一个采样的话,可存储共252x2+1=505个采样点(加上数据头里的一个采样值)。

    对于PCM编码的WAV文件,只需要按照顺序存储原始采样值即可,不需要分块。

    PCM编码的WAV文件实际例子:

    IMA-ADPCM编码的WAV文件实际例子:

     

    1. ADPCM编解码

    Windows自带的一个小工具

     

    这个小工具我试过了,转换成不是ima-adpcm格式, 而是转换成microsoft adpcm格式,这2种格式之间有什么区别 我不知道 ,但是市面上大多数是ima-adpcm格式,所以我就不研究这个microsoft adpcm格式了。

    兼容性问题:

    1, cooledit生成的IMA ADPCM 编译的WAV文件, foobar.exe不能播放,

    2. 录音笔录制的 ADPCM WAV就可以播放,

    对比发现,  cooledit生成的wav文件好像更符合标准,有fact部分,而录音笔录音的wav没有fact部分,标准规定如果是压缩的wav格式的话,要求有fact部分,但实际是有这部分播放器就不识别,放不出来,而没有这部分,大多数播放器就可以很好的播放。 或许是cooledit兼容性不好。

     

     

    展开全文
  • Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析 Wav文件格式解析
  • 解析WAV文件,并设计双缓存,用来播放音乐,检测到一个缓存播放完,就填充该缓存,下个播放完,就填充下个
  • wav全集解析.pdf

    2018-05-04 20:26:36
    wav全集解析.pdf wav全集解析.pdf wav全集解析.pdf wav全集解析.pdf
  • wav文件解析

    2020-05-17 16:26:46
    文章目录wav文件解析wav文件简介wav文件头wav文件格式编码类型wav文件读写API 本文将解析wav音频文件格式,并实现一套用于读写wav文件的API。 wav文件解析 wav文件简介 wav/wave文件格式是由微软开发的用于音频...


    本文将解析 wav音频文件格式,并实现一套用于读写 wav文件的 API


    wav文件解析

    wav文件简介

    wav/wave文件格式是由微软开发的用于音频数字存储的标准,它采用RIFFResource Interchange File Format,资源交换文件标准)文件规范,文件扩展名为.wav,采用小端存储。

    wav文件头

    wav文件分成两部分:

    • 文件头:主要包含标准的44字节文件头或经过了一些软件处理的58字节文件头,文件头中包含RIFF数据块,一个fmt数据块和一个data数据块
    • 数据块:用于存储数据,数据本身的格式为PCM或压缩型

    本文所介绍的wav文件头是标准的44字节文件头。

    wav文件格式

    wav文件格式如下:
    在这里插入图片描述

    通过wav文件头信息,我们可以计算出音频时长:

    音频时长 = Subchunk2Size/ByteRate
    

    编码类型

    wav文件几乎支持所有ACM规范的编码格式,其信息存储在文件头2122两个字节中,有如下编码格式:
    在这里插入图片描述

    wav文件读写API

    这里提供了一套用于wav文件读写的API,欢迎大家来添砖加瓦。


    微信公众号同步更新,微信搜索"AnSwEr不是答案"或者扫描二维码,即可订阅。

    在这里插入图片描述

    展开全文
  • wav格式解析

    2013-06-16 12:59:03
    wav 头信息解析 详细介绍wav文件的解析,头信息对应的位置代表的信息
  • WAV文件解析

    2020-08-17 11:20:13
    前面文件前面44字节(或46)存放信息,信息内容非常重要,下面会详细讲,解析也主要是这段的解析。 格式 使用AU2020导出wav文件,前面44字节存储的信息,其他没有测试。 分为四块 RIFF块、fmt块、fact块(压缩...

    下载

    csdn:https://download.csdn.net/download/shaynerain/12712663

    设置的0积分下载,后面可能会被系统改

    简介

    WAV音频格式之一,属于无损型的,主要内容就是PCM的数据。前面文件前面44字节(或46)存放信息,信息内容非常重要,下面会详细讲,解析也主要是这段的解析。

    格式

    使用AU2020导出wav文件,前面44字节存储的信息,其他没有测试。

    分为四块

    RIFF块、fmt块、fact块(压缩格式才有,一般没有)data块

    例子:

    地址

    区块

    长度

    端序

    内容

    0

    块标签

    4

    “RIFF”0x46464952

    4

    块大小

    4

    N+36

    8

    格式

    4

    “WAVE”0x45564157

    12

    块标签

    4

    “fmt”0x20746d66

    16

    块大小

    4

    16

    20

    音频格式

    2

    1(PCM)

    2(ADPCM)

    22

    声道数

    2

    1(单声道)

    2(双声道)

    24

    采样频率

    4

    (HZ)

    28

    字节速率

    4

    采样频率*位深度/8

    32

    区块对其

    2

    字节

    34

    位深度

    2

    bit

    36

    块标签

    4

    “data”0x5453494c

    40

    块大小

    4

    N=字节速率*秒数*声道数

    44

    数据块

    N

    音频数据

    移植

    移植主要是头文件,然后打开文件读取信息,上传的文件中做了双缓存处理,这部分时播放功能,会在其他文章中写出,具体可参照文件中的提取信息方式

    播放相关文章

    https://blog.csdn.net/shaynerain/article/details/108052072

    https://blog.csdn.net/shaynerain/article/details/108052191

    from:https://blog.csdn.net/shaynerain

    展开全文
  • wav 文件解析

    2013-06-16 12:57:18
    wav 头信息解析 详细介绍wav文件格式,以及相对应的位置代表的信息
  • wav头文件解析

    千次阅读 2019-06-27 12:23:18
    文章目录什么是wav格式文件构成文件头(也叫头文件)文件实体:wav头文件写头文件 方法一需要注意的是大端存储以及小端存储.从源码中可以看到写头文件 方法二 什么是wav格式 网上介绍wav 格式的文章已经很多了 为什么...

    什么是wav格式

    网上介绍wav 格式的文章已经很多了 为什么还要写这个文章

    • 练手 发帖子比较少,找到适合自己写作风格的方式 写帖子 为以后做准备
    • 整理自己的知识库, 这个知识点之前习得的过程比较零散.整理一下,心里有个底,思路上可以完善的将各个零散的点合并起来,便于记忆
    • 好记性不如烂笔头
    • 帮助后来者理解该知识点,每个知识点,每个人理解的方式过程不一样,没准有那么一类人,就喜欢我的心路风格呢

    .WAV 格式文件 为微软公司(Microsoft)开发的一种声音文件格式.

    WAV是最接近无损的音乐格式,所以文件大小相对也比较大.

    那么为什么 wav格式是如何存储的呢

    文件构成

    事实上 wav格式文件分为两部分,文件头+音频文件两部分
    wav文件格式样式

    文件头(也叫头文件)

    作用: 告诉播放器(为什么是告诉播放器,而不是告诉 word打开,应为.wav后缀的文件默认是用播放器打开的,你要强制用word去打开,我也没办法),这个文件 中的数据 如何使用, 用什么样的方法 才能正确的进行播放.
    就像迷宫门口的建筑图纸,还是带gps定位的那种,可以指引需要的人穿过 整个座迷宫,还顺便知道了迷宫的构造

    文件实体:

    作用: 具体播放的内容 就是迷宫本身
    当播放器 拿着迷宫门口的建筑图纸后,获取迷宫中的信息,那是分分钟的事.

    wav头文件

    头文件 听起来高大上,说白了依然是二进制流.(废话,所有数据都可以搞成二进制流) 其本质是按照一定格式规范 写的一个固定 说明书,
    就像图书,有个目录,有序,有引言.
    wav头文件有44个字节
    在这里插入图片描述
    如图[1][1]:图片来自http://soundfile.sapp.org/doc/WaveFormat/

    wav头文件描述
    如图,这就是头文件中的信息
    以及相互之间的关系

    写头文件 方法一

    需要注意的是大端存储以及小端存储.

    这个涉及到cpu的规则,我不太了解.
    在实际应用这个知识点时,
    涉及到 RandomAccessFile 的write 方法
    具体去看api了

    从源码中可以看到

    写头文件时,writeInt,writeShort,会将其中的序列翻过来,变为大端

    /**
         * Writes an {@code int} to the file as four bytes, high byte first.
         * The write starts at the current position of the file pointer.
         *
         * @param      v   an {@code int} to be written.
         * @exception  IOException  if an I/O error occurs.
         */
        public final void writeInt(int v) throws IOException {
            write((v >>> 24) & 0xFF);
            write((v >>> 16) & 0xFF);
            write((v >>>  8) & 0xFF);
            write((v >>>  0) & 0xFF);
            //written += 4;
        }
    
    

    而我们需要的顺序是

     	 
            write((v >>>  0) & 0xFF);
            write((v >>>  8) & 0xFF);
          	write((v >>> 16) & 0xFF);
          	write((v >>> 24) & 0xFF);
         
            
    

    因此在使用RandomAccessFile .writeInt,和writeByet时需要手动想将其倒序,然后调用api,就负负得正了

    开始写录音文件前调用

    /**
    	 * @param weikuan    位宽
    	 * @param nChannels  通道数
    	 * @param sampleRate 采样率
    	 * @throws IOException
    	 */
    	private void writeHead(short weikuan, short nChannels, int sampleRate) throws IOException {
    		RandomAccessFile rand;
    
    		int byteofSeconds = weikuan * nChannels * sampleRate/8;
    		rand = randomAccessFile;
    		//设置文件大小为0, 防止未知情况导致 该文件已经存在
    		rand.setLength(0);
    		//初始化wav文件的头文件
    
    		/* RIFF header */
    		rand.writeBytes("RIFF"); // riff id
    		rand.writeInt(0); // riff chunk size *PLACEHOLDER*
    		rand.writeBytes("WAVE"); // wave type
    
    		/* fmt chunk */
    		rand.writeBytes("fmt "); // fmt id
    		rand.writeInt(Integer.reverseBytes(16)); // fmt chunk size
    		rand.writeShort(Short.reverseBytes((short) 1)); // AudioFormat,1 for PCM
    		rand.writeShort(Short.reverseBytes(nChannels));// Number of channels, 1 for mono, 2 for stereo
    		rand.writeInt(Integer.reverseBytes(sampleRate)); // Sample rate 采样率
    		rand.writeInt(Integer.reverseBytes(byteofSeconds));//Byte rate,波形数据传输速率(每秒平均字节数)
    		// SampleRate*NumberOfChannels*BitsPerSample/8
    		//每次采样大小 单位byte
    		rand.writeShort(Short.reverseBytes((short) (nChannels * weikuan / 8))); // Block align,
    		// NumberOfChannels*BitsPerSample/8
    		rand.writeShort(Short.reverseBytes(weikuan)); // Bits per sample
    
    		/* data chunk */
    		rand.writeBytes("data"); // data id
    		rand.writeInt(0); // data chunk size *PLACEHOLDER*
    	}
    
    
    

    录完音后,补充 头文件中的内容

    
    	private void writeInsertHead() throws IOException {
    		RandomAccessFile rand = randomAccessFile;
    
    		rand.seek(4); // riff chunk size
    //			rand.writeInt(Integer.reverseBytes((int) (rand.length() - 8)));
    		rand.writeInt(Integer.reverseBytes((int) (dataSize + 36)));
    		rand.seek(40); // data chunk size
    //			rand.writeInt(Integer.reverseBytes((int) (rand.length() - 44)));
    		rand.writeInt(Integer.reverseBytes((int) (dataSize)));
    
    		onSuccess(rand.length());
    	}
    
    
    

    写头文件 方法二

    当然 如果搞不清上面的这个问题. 写头文件也可以直接使用writebyte,在录音结束时,返回到开口预留的44个字节中 从seek(0)开始,一次写入 44个字节的数组,就可以避开这个问题.

    /**
    	 * @param totalAudioLen 音频数据总大小
    	 * @param sampleRate    采样率
    	 * @param byteRate      位元(组)率(每秒的数据量 单位 字节/秒)   采样率(44100之类的) * 通道数(1,或者2)*每次采样得到的样本位数(16或者8) / 8;
    	 * @param nChannels     声道数量
    	 * @param weikuan       位宽
    	 * @throws IOException
    	 */
    	private void writeHead(int totalAudioLen, int sampleRate, int byteRate, int nChannels, int weikuan) throws
    			IOException {
    
    		RandomAccessFile rand = randomAccessFile;
    
    
    		long totalDataLen = totalAudioLen + 36;
    	
    
    		//长度
    		print(rand.readInt());
    
    		rand.seek(0);
    
    
    
    		byte[] header = new byte[44];
    		header[0] = 'R'; // RIFF/WAVE header
    		header[1] = 'I';
    		header[2] = 'F';
    		header[3] = 'F';
    		header[4] = (byte) (totalDataLen & 0xff);
    		header[5] = (byte) ((totalDataLen >> 8) & 0xff);
    		header[6] = (byte) ((totalDataLen >> 16) & 0xff);
    		header[7] = (byte) ((totalDataLen >> 24) & 0xff);
    		header[8] = 'W';
    		header[9] = 'A';
    		header[10] = 'V';
    		header[11] = 'E';
    		header[12] = 'f'; // 'fmt ' chunk
    		header[13] = 'm';
    		header[14] = 't';
    		header[15] = ' ';
    		header[16] = 16; // 4 bytes: size of 'fmt ' chunk
    		header[17] = 0;
    		header[18] = 0;
    		header[19] = 0;
    		header[20] = 1; // format = 1
    		header[21] = 0;
    		header[22] = (byte) (nChannels & 0xff);
    		header[23] = (byte) ((nChannels >> 8) & 0xff);
    
    		header[24] = (byte) (sampleRate & 0xff);//采样率
    		header[25] = (byte) ((sampleRate >> 8) & 0xff);
    		header[26] = (byte) ((sampleRate >> 16) & 0xff);
    		header[27] = (byte) ((sampleRate >> 24) & 0xff);
    
    		header[28] = (byte) (byteRate & 0xff);//取八位
    		header[29] = (byte) ((byteRate >> 8) & 0xff);
    		header[30] = (byte) ((byteRate >> 16) & 0xff);
    		header[31] = (byte) ((byteRate >> 24) & 0xff);
    
    		int b = weikuan * nChannels / 8;//每次采样的大小
    		header[32] = (byte) (b & 0xff); // block align
    		header[33] = (byte) ((b >> 8) & 0xff);
    
    		header[34] = (byte) (weikuan & 0xff);//位宽
    		header[35] = (byte) ((weikuan >> 8) & 0xff);
    		
    		header[36] = 'd';//data
    		header[37] = 'a';
    		header[38] = 't';
    		header[39] = 'a';
    		header[40] = (byte) (totalAudioLen & 0xff);
    		header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
    		header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
    		header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
    
    		rand.write(header, 0, header.length);
    
    
    

    本文参考了
    http://soundfile.sapp.org/doc/WaveFormat/
    https://www.cnblogs.com/wangguchangqing/p/5957531.html
    https://www.jianshu.com/p/90c77197f1d4

    展开全文
  • wav文件格式解析

    2014-10-23 09:14:55
    wav文件内容解析,分析wav头部息与获取数据内容
  • WAV格式解析

    2019-05-12 22:55:00
    WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持, 该格式也支持MSADPCM,...
  • wav格式解析.doc

    2019-05-09 22:59:20
    WAV 格式详解学习用 头文件,头文件每个字节的意义都有说明
  • Qt 之 WAV文件解析

    千次阅读 2016-10-10 15:25:05
    通过以上对wav格式的分析,我们可以对一个wav文件进行解析,获取文件具体的信息,下篇中将会给出具体代码实现来解析一个wav文件,输出文件的信息。 wav文件属性的计算 如果我们知道采样频率、每次采样...
  • 多通道 wav 文件解析

    2020-09-10 20:06:40
    WAV文件格式解析及处理 https://cloud.tencent.com/developer/article/1358832 上述文章.了解 wave 是如何处理的 https://www.jianshu.com/p/5a91edee4871 WAV 文件格式 上述文件,清晰的解析wav 的头 44 字节是...
  • C语言解析wav文件格式

    千次阅读 2020-01-21 21:18:36
    C语言解析wav文件 接下来在了解了wav文件的有关概念后,我们将通过学习C语言的有关函数库进行wav文件的一些元数据提取出来备用。 1.wav文件的二进制格式解析 一个wav文件的二进制解析: 二进制文件,本质上就是...
  • WAV 文件格式解析

    2012-09-23 23:44:45
    关于WAV的描述 详解了其结构 对编写WAV的播放器有辅助作用
  • wav格式解析,vs201

    2018-08-19 14:54:25
    WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,...
  • wav音频文件解析

    2021-05-14 14:29:59
    wav音频文件解析概述文件结构RIFF区块FORMAT区块DATA区块demo解析结果测试文件相关资料 概述   Waveform Audio File Format(WAVE,又或者是因为WAV后缀而被大众所知的)是最常见的声音文件格式之一,是微软公司...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,403
精华内容 4,161
关键字:

WAV解析